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
标准 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