Sml 如何定义异构列表数据类型?

Sml 如何定义异构列表数据类型?,sml,smlnj,Sml,Smlnj,我刚开始学习SML,有一些问题。我想为非同构列表定义一个数据类型。 例如 val a = [1,[2,4,3],5,[2,6]] 我已经创建了这个数据类型 datatype 'a MulList = List of 'a multiList list | E of 'a; 但是我得到了以下错误 /tmp/emacs-region29207RwC:8.34-8.43 Error: unbound type constructor: multiList

我刚开始学习SML,有一些问题。我想为非同构列表定义一个数据类型。
例如

val a = [1,[2,4,3],5,[2,6]] 
我已经创建了这个数据类型

datatype 'a MulList = List of 'a multiList list
                    | E of 'a;
但是我得到了以下错误

/tmp/emacs-region29207RwC:8.34-8.43 Error: unbound type constructor: multiList

uncaught exception Error
  raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27
             ../compiler/TopLevel/interact/evalloop.sml:44.55
             ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20

您的数据类型声明有一些错误。首先,将值构造函数的第一个字母大写是一种很好的做法(正如您所做的),但是,在所有小写字母中使用类型构造函数也是一种很好的做法。
真正的错误是,在定义值构造函数
List
时,将
mullist
类型引用为
multiList

修复后,您可以创建多重列表:

datatype 'a mullist = List of 'a mullist list
                    | E of 'a

val a = [E 1, List [E 2, E 4, E 3], E 5, List [E 2, E 6]]

到目前为止?数据类型“a MulList=列表中的一个”多列表列表| E of“a;我创建了这个,但我认为它可能有更好的语法。谢谢你的回答,你是对的。但我只是抄错了,斯瑞。你是说这是穆利斯特的唯一一次德尔克雷?那好吗?还有其他好的语法吗?它不一定是生成“多列表”的唯一方法,但这取决于具体情况。然而,我想说,这是一个适合所提出问题的解决方案。因此,如果我想用这种格式交换元素,例如
e1
,我该怎么做?@sarahysh,你能更具体一点吗?我不知道你在说什么。根本不可能声明
[[2,4,3]、1,5、[2,6]]
的值。类型系统不允许这样的类型。这与您不能拥有此列表的原因相同
[1,“1.1”,1.1]
。SML是一种静态类型语言,这意味着类型系统需要在编译时知道所有类型。在编译时(当n未知时),不可能知道第n个元素的类型。