Haskell中缀数据类型构造函数的语法规则

AJF*_*mar 8 constructor haskell types infix-notation

我正在尝试使Haskell数据类型有点像python字典,ruby散列或javascript对象,其中字符串链接到一个值,如下所示:

data Entry t = Entry String t
type Dictionary t = [Entry t]
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常.但是,我想要一个稍好的构造函数,所以我尝试像这样定义它:

data Entry t = String ~> t
Run Code Online (Sandbox Code Playgroud)

这失败了.我试过这个:

data Entry t = [Char] ~> t
Run Code Online (Sandbox Code Playgroud)

再一次,它失败了.我知道~在Haskell 中有特殊含义,GHCi仍然允许操作员~>,但我还是尝试了另一种方式:

data Entry t = [Char] & t
Run Code Online (Sandbox Code Playgroud)

而另一个由于解析错误导致的失败.我发现这令人困惑,因为出于某些莫名其妙的原因,这有效:

data Entry t = String :> t
Run Code Online (Sandbox Code Playgroud)

这是否意味着对于中缀类型构造函数中可能出现的字符存在某些规则,或者它是一种误解.我不是Haskell的新手,而且我知道使用第一个构造函数会更加惯用,但是这个让我感到困惑,而且它似乎是Haskell的一个重要组成部分,我缺少了.

bhe*_*ilr 9

任何以冒号开头的运算符:都是类型构造函数或数据构造函数,但是(->).如果你想要波浪号,你可以使用:~>,但你不会逃避使用不以冒号开头的东西. 资源

  • 我喜欢将`:`视为`.`的"大写"版本,并且我们知道Haskell构造函数必须以大写字母开头... ;-) (6认同)