withtype以mlton失败并成功使用smlnj

时间:2012-10-21 19:11:25

标签: types recursion sml smlnj

我正在编写一个应用程序,我想在数据类型声明的withtype子句中定义许多类型。以下代码段演示了它:

datatype ta = A
withtype tb = int
     and tc = tb

mlton 无法编译此代码,但 smlnj 成功。

$ mlton -stop o test.sml
Error: test.sml 3.15.
  Undefined type tb.
compilation aborted: parseAndElaborate reported errors

我使用的是mlton-20100608和smlnj-110.71。

这是mlton中的错误吗?

我不知道如何在没有这种声明的情况下继续:一组相互递归的数据类型和类型。

这个想法来自Andrew Appel在他的书Modern Compiler Implementation in ML,第98页,文件absyn.sml

中提出的关于Tiger语言的抽象语法树类型

1 个答案:

答案 0 :(得分:1)

根据mlton社区的Andreas Rossberg的说法,这不是mlton的错误,而是SML / NJ标准的(已知)偏差。根据规范,withtype之后的类型缩写是彼此递归,只有前面的数据类型。该示例被重写为

datatype ta = A
type tb = int
and tc = tb

也就是说,MLton标记这一点是正确的。

总是可以扩展右侧的其他类型构造函数,因此它没有实际限制。但是,这样做可能会非常麻烦。