2016-08-17 66 views
3

在Haskell中,使用双冒号键入声明,即(::),如not :: Bool -> BoolHaskell和Haskell类语言之间的类型声明语法区别

但是在许多其语言与Haskell相似的语言中,例如,榆树,阿格达, 他们使用单个冒号(:)来声明类型。像not : Bool -> Bool

为什么这些语言放弃了haskell样式类型声明语法。

  • 是(:)比(::)更好地声明一个类型?
  • 还是(::)更适合其他用途?
  • 还是因为(:)是一个小于(::)的字符?
+1

FWIW,我认为'::'实际上在顶层签名中更好地阅读,因为它在值级别和类型级别之间带来更多空间。 'not:Bool - > Bool'看起来有点像它应该被解析的'(不是:Bool) - > Bool'。但许多现有的中缀操作员都有很多相同的问题;我想这基本上只是你常用的东西。 – leftaroundabout

+0

如果你假装一个类型注释是一个实际值,'::'是有道理的。它与任何其他中缀构造函数一样以':'开头,它在类型注释的“真实”符号之前,并给出一个名称和一个类型作为参数,它返回一个类型注释。 – chepner

回答

9

听说SPJ说,某个地方,这是一个争论的问题,选择:::之间 。他和约翰·休斯最终以::结算。从 的A History of Haskell: Being Lazy With Class纸:

我们从米兰达采用的惯例,数据构造是 资本,而变量都没有,并且加入了类似的规定 中缀构造,这在Haskell必须以一个冒号开始。为了与我们的使用(来自SASL,KRC和Miranda的采用 )一致,我们选择了后面的约定:对于列表“cons” 运算符。 (该选择“:”类型 签名利弊和“::”,顺便说一下,是一个争论激烈的话题(ML是否 对面),并仍然是有争议的这一天。)

+0

我不认为这是SPJ和约翰休斯谁决定这一点。最初是Phil Wadler的设计(模仿Miranda和Orwell),然后Haskell委员会保留它。这是一个不幸的选择。 – augustss

+0

是的,我认为这是在SPJ和Wadler之间。我可能会尝试在周末之前链接视频。 – Sibi

10

IIRC Haskell选择使用::是一个(不幸的)历史事故。 Haskell基本上基于Miranda,其还使用::作为类型。米兰达的作者真的希望利弊运营商是:,因为他们认为它会更普遍使用,所以键入操作员必须被授权到::

它确实没有被证明是一个好主意,因为否则所有关于类型的文献(甚至是谈论Haskell)都使用:。作为最接近的paper at hand,双冒号用于所有样本(Haskell)代码,但数学判断(如第10页)均遵循传统单冒号。


我想我记得听到的地方(编辑:这是here,但我懒得听整个事情得到正确的时间),在当时,很多计划生育研究人员只是想非常清楚地界定米兰达,以便研究论文谈论懒惰功能纯语言可以有一个共同的语言来谈论他们的想法。米兰达的设计师不希望这样做,而是表示如果用与米兰达非常相似的另一种语言(为了双方的利益而提供的,这两种语言仍然可以区分),他们会没事的。 。这是Haskell委员会的起点。

+3

我不会称之为_that_不幸。颠倒它们可能会更好一些,但是Haskell符号与通用数学符号略有不同(这在许多其他地方都是这种情况)。 – Cubic

+0

你的脚注不完全准确。 – augustss