SML:数据类型声明将不允许[]

时间:2018-12-26 02:09:40

标签: types sml

标准SML基础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

但是由于缺少方括号,因此此版本不会产生类似于列表的输出:

- 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为什么不接受[]的原始尝试?

1 个答案:

答案 0 :(得分:2)

此:

  

标准SML基础列表定义为

datatype 'a list = [] | :: of 'a * 'a list

不正确。

相反,list的定义如下:

datatype 'a list = nil | :: of 'a * 'a list

[foo, bar, baz]表示法是一种特殊的语法(“派生形式”),《标准ML修订版》中的定义明确定义(在第56页的附录A中)为等效于foo :: bar :: baz :: nil


对于您的类型,您将无法重新定义[...]语法-它是语言内置的,其含义是固定的-但您可以使语法至少有点通过使用符号(非字母数字)标识符并将其声明为infix和right-associative来更友好;例如:

infixr :::

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

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