在Haskell中,使用双冒号键入声明,即(::),如not :: Bool -> Bool
。
但是在许多语言中,其语法类似于Haskell,例如榆树,阿格达,
他们使用单冒号(:)来声明类型。比如not : Bool -> Bool
。
为什么这些语言放弃了haskell样式类型声明语法。
答案 0 :(得分:12)
::
的选择有点(不幸)历史事故。 Haskell主要基于Miranda,它也使用::
类型 1 。 Miranda的作者真的希望cons运算符为:
,因为他们认为它将无处不在地使用,因此必须将键入运算符委托给::
。
事实证明这并不是一个好主意,因为否则所有关于类型的文献(甚至是关于Haskell的文献)都使用:
。作为最接近的paper at hand,双冒号用于所有样本(Haskell)代码,但数学判断(如第10页)都遵循传统的单冒号。
1 我想我记得在某个地方听过(编辑:那是here,但是我懒得听完整个事情才能得到合适的时间)时间,很多FP研究人员只是想非常清楚地定义米兰达,以便研究论文谈论懒惰功能的纯语言可以有一个共同的语言来谈论他们的想法。米兰达的设计师并不想要这个,但是如果用另一种与米兰达非常相似的语言(为了双方的利益,提供这两种语言仍然可以区分的话)说他们会好的。 。这是Haskell委员会的起点。
答案 1 :(得分:9)
我听说SPJ在某个地方说这是一个值得争论的问题
在:
和::
之间。他和约翰休斯最终决定::
。从
A History of Haskell: Being Lazy With
Class论文:
我们从Miranda采用了数据构造函数的约定 资本化而变量不是,并添加了类似的约定 对于中缀构造函数,在Haskell中必须以冒号开头。该 选择后一种惯例是为了与我们的使用保持一致(采用 来自SASL,KRC和Miranda)的单一冒号:列表“cons” 运营商。 (选择“:”表示cons,“::”表示类型 顺便说一句,签名是一个激烈争论的问题(ML的确如此 相反)并且至今仍然存在争议。)