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