Types SML:数据类型声明赢得';不允许

Types SML:数据类型声明赢得';不允许,types,sml,Types,Sml,标准SML基础列表定义为 datatype 'a list = [] | :: of 'a * 'a list datatype 'a list = [] | :: of 'a * 'a list 但是,当我尝试创建自己的列表数据类型时,会出现以下错误: - datatype 'a mylist = [] | mycons of 'a * 'a mylist Error: syntax error found at LBRACKET 然而,这是可行的: - datatype 'a myl

标准SML基础
列表
定义为

datatype 'a list = [] | :: of 'a * 'a list
datatype 'a list = [] | :: of 'a * 'a list
但是,当我尝试创建自己的列表数据类型时,会出现以下错误:

- datatype 'a mylist = [] | mycons of 'a * 'a mylist
 Error: syntax error found at LBRACKET
然而,这是可行的:

- datatype 'a mylist = Nil | mycons of 'a * 'a mylist;
datatype 'a mylist = Mycons of 'a * 'a mylist | Nil
但由于缺少方括号,此verson无法生成非常类似列表的输出:

- Mycons (1,Nil);
val it = Mycons (1,Nil) : int mylist
- Mycons (1, Mycons (1,Nil));
val it = Mycons (1,Mycons (1,Nil)) : int mylist
为什么SML不接受我最初尝试的
[]

这个:

标准SML基础清单定义如下:

datatype 'a list = [] | :: of 'a * 'a list
datatype 'a list = [] | :: of 'a * 'a list
这是不对的

相反,
list
的定义如下:

datatype 'a list = nil | :: of 'a * 'a list
[foo,bar,baz]
符号是一种特殊的语法(一种“派生形式”),经修订的标准ML定义(在附录a第56页)明确定义为等同于
foo::bar::baz::nil


对于您的类型,您将无法重新定义
[…]
语法-它内置于语言中,其含义是固定的-但您可以通过使用符号(非字母数字)标识符并将其声明为中缀和右关联,使您的语法至少更友好一些;例如:

infixr :::

datatype 'a my_list = MY_NIL | ::: of 'a * 'a my_list

val twoOnes = 1 ::: 1 ::: MY_NIL
这:

标准SML基础清单定义如下:

datatype 'a list = [] | :: of 'a * 'a list
datatype 'a list = [] | :: of 'a * 'a list
这是不对的

相反,
list
的定义如下:

datatype 'a list = nil | :: of 'a * 'a list
[foo,bar,baz]
符号是一种特殊的语法(一种“派生形式”),经修订的标准ML定义(在附录a第56页)明确定义为等同于
foo::bar::baz::nil


对于您的类型,您将无法重新定义
[…]
语法-它内置于语言中,其含义是固定的-但您可以通过使用符号(非字母数字)标识符并将其声明为中缀和右关联,使您的语法至少更友好一些;例如:

infixr :::

datatype 'a my_list = MY_NIL | ::: of 'a * 'a my_list

val twoOnes = 1 ::: 1 ::: MY_NIL

就my_列表中的
'a*'而言,这似乎是一个元组,因此如果不是中缀
::
我们有原始的
mycons
,我们可以有'mycons(1,Nil)。这是正确的评估吗?就my_列表而言,这似乎是一个元组,因此如果不是中缀
::
我们有原始的
mycons
,我们可以有'mycons(1,Nil)。这是正确的评估吗?