【问题标题】:How can I define a heteregeneous list datatype?如何定义异构列表数据类型?
【发布时间】:2013-03-25 03:16:07
【问题描述】:

我刚开始学习 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

【问题讨论】:

  • what have you tried 到目前为止?
  • datatype 'a MulList= List of 'a multiList list | E的'一个;我创建了这个,但我认为它可能有更好的语法。

标签: sml smlnj


【解决方案1】:

您的数据类型声明有一些错误。首先,将值构造函数的第一个字母大写是一种很好的做法(就像您所做的那样),但是将类型构造函数全部小写也是一种很好的做法。
您遇到的真正错误是在定义值构造函数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]]

【讨论】:

  • 谢谢你的回答,你是对的。但我只是复制错了,srry。你的意思是这只是对mullist的贬低?那好吗?还有其他不错的语法吗?
  • 这不一定是制作“多列表”的唯一方法,但这完全取决于具体情况。但是我会说这是解决所提出问题的合适解决方案。
  • 那么如果我想用E 1这种格式交换元素应该怎么做呢?
  • @sarahysh,你能说得更具体点吗?我不知道你在说什么。
  • 根本不可能声明[[2,4,3],1,5,[2,6]] 的值。类型系统不允许这种类型。这与您不能拥有此列表[1, "1.1", 1.1] 的原因相同。 SML 是一种静态类型语言,这意味着类型系统需要在编译时知道所有类型。在编译时(当 n 未知时),不可能知道第 n 个元素的类型。
猜你喜欢
  • 2019-11-26
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多