Types withtype使用mlton失败,使用smlnj成功

Types withtype使用mlton失败,使用smlnj成功,types,recursion,sml,smlnj,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 error

我正在编写一个应用程序,希望在数据类型声明的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的一个bug吗

如果没有这种声明,我不知道如何继续:一组相互递归的数据类型和类型


这个想法来源于Andrew Appel在其著作《第98页》中提出的老虎语言抽象语法树类型,在文件中

根据mlton社区的Andreas Rossberg的说法,这不是mlton的错误,而是SML/NJ方面与标准的(已知)偏差。根据规范,
withtype
后面的类型缩写是递归的,仅与前面的数据类型相关。该示例被改写为

datatype ta = A
type tb = int
and tc = tb
也就是说,MLton标记这一点是正确的

一个总是可以在右边展开其他类型的构造函数,因此这不是真正的限制。不过,不得不这样做可能会很讨厌