我无法理解sml中的某些,无,是

时间:2018-10-02 07:19:12

标签: sml smlnj

我听不懂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

我错了吗?

1 个答案:

答案 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,则该定义实际上将与内置库冲突,并因此将其隐藏,使引用它的所有标准库函数的用处不大,因为您无法直接使用isSomedatatype 'a option = NONE | SOME of 'a来创建值或对其进行模式匹配,也无法使用NONE进行类型注释。