【问题标题】:SML: datatype declaration won't allow []SML:数据类型声明不允许 []
【发布时间】:2018-12-26 10:25:06
【问题描述】:

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

【问题讨论】:

    标签: types sml


    【解决方案1】:

    这个:

    标准的 SML 基础列表定义为

    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.


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

    infixr :::
    
    datatype 'a my_list = MY_NIL | ::: of 'a * 'a my_list
    
    val twoOnes = 1 ::: 1 ::: MY_NIL
    

    【讨论】:

    • 'a * 'a my_list而言,这似乎是一个元组,因此如果我们使用原始:::而不是中缀mycons,我们可以使用`mycons (1,零)。这是一个正确的评估吗?
    猜你喜欢
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 2021-04-11
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    相关资源
    最近更新 更多