在我阅读有关 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
。