在我阅读有关 monads 的本教程时,发现了以下表达式。
数据 M a = 引发异常 | 返回一个
类型异常 = 字符串
它说a用作类型变量和Raise Exception and Return a中的值范围,但我不明白这里M的用途(或含义)。如果 M 是一种数据类型,为什么要像 M a 一样使用它?
在我阅读有关 monads 的本教程时,发现了以下表达式。
数据 M a = 引发异常 | 返回一个
类型异常 = 字符串
它说a用作类型变量和Raise Exception and Return a中的值范围,但我不明白这里M的用途(或含义)。如果 M 是一种数据类型,为什么要像 M a 一样使用它?
您需要区分值构造函数和类型构造函数。
M不是数据类型,它是数据类型构造函数。所以要构造一个 Type 的数据类型,M a你给 Type 构造函数M,一个 Type 的数据类型a来获取 type 的数据类型M a。例如数据类型M Int或M String.
另一方面Raise,Return这里是值构造函数。所以要获得一个类型的值,说M Int你给值构造函数Return提供一个类型的值Int,比如Return 2。
这背后有一个很好的理论。您可以在此处阅读有关值和类型构造函数的更多信息。
M是正在定义的类型构造函数的名称,a是此构造函数的类型参数。稍后要使用该数据类型,您必须为构造函数M提供类型参数a,例如M Int。