我正在编写一个应用程序,我想在数据类型声明的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
答案 0 :(得分:1)
根据mlton社区的Andreas Rossberg的说法,这不是mlton的错误,而是SML / NJ标准的(已知)偏差。根据规范,withtype
之后的类型缩写是不彼此递归,只有前面的数据类型。该示例被重写为
datatype ta = A
type tb = int
and tc = tb
也就是说,MLton标记这一点是正确的。
总是可以扩展右侧的其他类型构造函数,因此它没有实际限制。但是,这样做可能会非常麻烦。