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

SML: datatype declaration won't allow []

标准 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 不接受我最初对 [] 的尝试?

这个:

The standard SML Basis list is defined as

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

不正确。

相反,list 是这样定义的:

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

[foo, bar, baz] 表示法是 标准 ML 定义,修订版 明确定义的特殊语法("derived form")(在附录 A 中,第 56 页)等同于 foo :: bar :: baz :: nil.


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

infixr :::

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

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