我能';有些不懂,有些不懂,有些在sml里

我能';有些不懂,有些不懂,有些在sml里,sml,smlnj,Sml,Smlnj,我不懂一些,一点也不懂,有些是sml的 正如我所知,每个p1,p2…pn都是构造函数 case e0 of p1 => e1 p1 => e1 |p2 => e2 … |pn => en 但当我们表示 datatype'a option=NONE |部分'a 教授说没有一个不是构造函数,只是“选项”的子类型 我不明白为什么会这样 我也有这样的错误 isSome NONE; stdIn:1.2-23.4 Error: operator and ope

我不懂一些,一点也不懂,有些是sml的 正如我所知,每个p1,p2…pn都是构造函数

case e0 of
 p1 => e1
 p1 => e1
|p2 => e2 
 …
|pn => en
但当我们表示

datatype'a option=NONE |部分'a

教授说没有一个不是构造函数,只是“选项”的子类型 我不明白为什么会这样

我也有这样的错误

 isSome NONE;    

 stdIn:1.2-23.4 Error: operator and operand do not agree [tycon mismatch]                                                           
 operator domain: 'Z ?.Assembly.option
我错了吗

NONE
不是构造函数,只是
'a选项的子类型

我没有想到说
NONE
是一个类型为
'a option
的值/模式构造函数是错误的。我不确定你的教授想说什么,但也许是一个选项实际上是一系列类型
NONE
是每种类型的值/模式构造函数
'a option
用于
'a
的具体值,但由于
NONE:'a option
,即使它不接受任何值参数,它也会接受类型参数(例如
int option
int),使其更高

标准ML没有一种语法来描述类型运算符的类型,如
option
,但在Haskell中,我们会说
option
有kind
*->*
int option
有kind
*
。返回到
NONE:“一个选项”
,您可以具体化它所没有的内容,以获得明确的单一类型的值/模式构造函数

如果你对类型理论感兴趣的话。一个更简单、更不精确的观点是{
NONE
}是
'A option
类型的值的子集,并且该子集在结构上与
单元
类型{
()
}等价。但是
NONE
,作为该子集的一个元素,不是子类型,也不是类型。它是一个值和一个模式构造函数,具体取决于使用它的位置:

fun isSome NONE = false
  | isSome (SOME _) = true
这里,模式中使用了
NONE

fun map f NONE = NONE
  | map f (SOME x) = SOME (f x)
此处,
NONE
用于左侧的图案中,并用作右侧的值

也许在类型理论方面有更多经验的人可以纠正我

这看起来像是一个选项有两个相互冲突的定义,一个是您自己定义的,另一个来自标准库。像
这样的标准库函数是一些
只对标准库定义的类型起作用,因此,如果为了说明目的而声明自己的
数据类型'a option=NONE | a
中的一些,那么该定义实际上会与内置的定义冲突,并因此影响内置的定义,使所有引用它的标准库函数变得不那么有用,因为您无法使用
NONE
SOME…
直接创建或模式匹配值,或者使用
键入annotate:。。。选项

NONE
不是构造函数,只是
'a选项的子类型

我没有想到说
NONE
是一个类型为
'a option
的值/模式构造函数是错误的。我不确定你的教授想说什么,但也许是一个选项实际上是一系列类型
NONE
是每种类型的值/模式构造函数
'a option
用于
'a
的具体值,但由于
NONE:'a option
,即使它不接受任何值参数,它也会接受类型参数(例如
int option
int),使其更高

标准ML没有一种语法来描述类型运算符的类型,如
option
,但在Haskell中,我们会说
option
有kind
*->*
int option
有kind
*
。返回到
NONE:“一个选项”
,您可以具体化它所没有的内容,以获得明确的单一类型的值/模式构造函数

如果你对类型理论感兴趣的话。一个更简单、更不精确的观点是{
NONE
}是
'A option
类型的值的子集,并且该子集在结构上与
单元
类型{
()
}等价。但是
NONE
,作为该子集的一个元素,不是子类型,也不是类型。它是一个值和一个模式构造函数,具体取决于使用它的位置:

fun isSome NONE = false
  | isSome (SOME _) = true
这里,模式中使用了
NONE

fun map f NONE = NONE
  | map f (SOME x) = SOME (f x)
此处,
NONE
用于左侧的图案中,并用作右侧的值

也许在类型理论方面有更多经验的人可以纠正我


这看起来像是一个选项有两个相互冲突的定义,一个是您自己定义的,另一个来自标准库。像
这样的标准库函数是一些
只对标准库定义的类型起作用,因此,如果为了说明目的而声明自己的
数据类型'a option=NONE | a
中的一些,那么该定义实际上会与内置的定义冲突,并因此影响内置的定义,使所有引用它的标准库函数变得不那么有用,因为您无法使用
NONE
SOME…
直接创建或模式匹配值,或者使用
键入annotate:。。。选项

我认为你的教授不是困惑就是不清楚
NONE
是一个构造函数,而不是一个类型,SML也没有正常意义上的子类型。我认为你的教授要么困惑,要么不清楚
NONE
是一个构造函数,而不是一个类型,并且SML没有正常意义上的子类型。