我听不懂SML中的SOME,NONE,isSome 据我所知,每个p1,p2 ... pn都是构造函数。
case e0 of
p1 => e1
p1 => e1
|p2 => e2
…
|pn => en
但是当我们表示
datatype 'a option = NONE | SOME of 'a
教授说NONE不是构造函数,而只是'a option的子类型 我不明白为什么。
我也有这样的错误
isSome NONE;
stdIn:1.2-23.4 Error: operator and operand do not agree [tycon mismatch]
operator domain: 'Z ?.Assembly.option
我错了吗?
答案 0 :(得分:2)
的子类型
NONE
不是构造函数,而只是'a option
我没有想到说NONE
是类型'a option
的值/模式构造函数是错误的。我不确定您的教授打算说什么,但是也许'a option
实际上是一个类型的家庭/集合。 NONE
是'a option
具体值的每种类型'a
的值/模式构造函数,但是自NONE : 'a option
起,即使它不使用任何 value < / em>参数,它确实采用了 type 参数(例如{{1}代表int
),使其kind更高。
标准ML没有描述int option
之类的类型运算符类型的语法,但是在Haskell中,我们会说option
具有类型option
和{{1 }}具有种类* -> *
。回到int option
,您可以具体化什么,这毫无疑问地可以得到单一类型的值/模式构造函数。
这是您是否要研究类型理论。一个更简单且不太精确的视图是 {*
} 是类型NONE : 'a option
的值的子集,并且该子集的结构等效于NONE
类型 {{'a option
} 。但是unit
作为该子集的元素,不是子类型或根本不是类型。它是一个 value 和一个 pattern 构造函数,具体取决于您使用的位置:
()
此处,NONE
用于模式。
fun isSome NONE = false
| isSome (SOME _) = true
在这里,NONE
用于左侧的模式,而用作右侧的值。
也许在类型理论方面有更多经验的人可以纠正我。
fun map f NONE = NONE | map f (SOME x) = SOME (f x)
这看起来像您对NONE
有两个冲突的定义,一个是您自己创建的,另一个是来自标准库的。像- isSome NONE;
stdIn:1.2-23.4 Error: operator and operand do not agree [tycon mismatch]
这样的标准库函数只能在标准库定义的类型上使用,因此,如果出于说明目的声明自己的'a option
,则该定义实际上将与内置库冲突,并因此将其隐藏,使引用它的所有标准库函数的用处不大,因为您无法直接使用isSome
和datatype 'a option = NONE | SOME of 'a
来创建值或对其进行模式匹配,也无法使用NONE
进行类型注释。