Mot*_*oth 6 haskell prolog sml infix-notation
根据 David MacQueen 在他对标准 ML报告1 的思考,
词法范围的中缀指令是 Pop-2 的一个不明智的遗产。它们使解析变得复杂并且它们不能很好地与模块系统一起工作,因为中缀指令不能通过结构导出或在签名中指定(并且添加这样的功能不是一个好主意)。
现在我确实同意他的说法,即infix[r]声明的私有范围是一个坏主意,它使导入的用户定义运算符变得毫无用处,但我为此设想的解决方案是实际导出签名中的这些声明..彻底摆脱它们。
在我所知道的具有固定性声明的语言(ML 和派生类、Haskell 和派生类、Prolog 等)中,我对它们是否记录了该想法的优点和/或缺点很感兴趣。更一般地说,语言实现者的既定设计经验可以为看起来(从用户角度)一个很好的便利功能的缺点带来有趣的见解。
所以我的问题是,简而言之,文献中是否有引用和/或已知问题支持 MacQueen 关于不输出固定性的观点?
小智 3
一种可能性是,如果您看到类似的内容x op1 y op2 z,您不知道它是否意味着op1(x, op2(y, z))或op2(op1(x, y), z)。Prolog 有write_canonical,它以纯前缀形式编写,因此您始终可以准确地知道某些内容是如何被解析的。
还有从模块导出运算符声明的问题(SWI-Prolog 似乎已经做到了这一点)。
除此之外,我想不出有什么缺点。在可读性和一致性方面有巨大的优势。例如,DCG 的一个变体定义了一个运算符-->>,类似于现有的-->...这使得事情比所有内容都必须使用前缀表示法编写更具可读性。