Standard ML 中的结构共享是如何被破坏的?

How is structure sharing broken in Standard ML?

Bob Harper 在 2013 年 presentation about the future of Standard ML 的幻灯片 9 中说 "structure sharing is broken"。有人可以提供更多详细信息吗?我没有足够的分享经验来理解他的意思。

它已损坏,因为按照规定,它不能应用于具有透明类型组件的结构。例如:

signature S = sig type t; type u = int end
signature T =
sig
  structure A : S
  structure B : S
  sharing A = B
end

这已经是非法的,尽管您自然会认为这没问题。

这里的历史是在 SML'90 中引入了结构共享,其中不存在透明类型组件。在 SML'97 中,添加了这些。那时,整个具有共享约束的业务变得有些过时,因为它们(在某种程度上)被 "where type" 约束所取代。因此,共享的语义被大大简化,结构共享从原始语法糖退化。但是这种糖被定义为仅适用于 SML'90 程序——如果您仅将其视为向后兼容 hack,这是有道理的,但如果您考虑结构共享 SML'97 的核心功能,则没有意义。

SML 社区的人不同意共享限制的相关性。有些人认为它们已经过时,有些人仍然很重要。不幸的是,SML'97 未能添加 "where structure" 约束,这本可以正确地替换结构 shairing。

Andreas Rossberg 的回答已经说明了问题,但是在Andreas 回答之前我已经写信给Harper 教授了。我把他的回复贴在这里以供好奇:

It's a purely technical problem with the definition. In SML 90 there was a notion of structure sharing above and beyond the constituent type sharing. In SML 97 structure sharing was redefined to mean sharing of the constituent types, but the formulation is incorrect (there are several candidate replacements, so compilers differ in their behavior). It's a dark corner anyway, so in the scheme of things it is very minor, but the mistake and the associated incompatibilities render it useless any more.