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

9
我正在尝试将Haskell数据类型制作成类似于Python字典、Ruby哈希或JavaScript对象的形式,其中一个字符串链接到一个值,如下所示:
data Entry t = Entry String t
type Dictionary t = [Entry t]

上述代码可以正常运行。然而,我希望有一个更好的构造函数,所以我尝试像这样定义它:
data Entry t = String ~> t

这个失败了。我尝试过这样做:

data Entry t = [Char] ~> t

再次失败了。我知道在Haskell中~具有特殊含义,而GHCi仍允许使用运算符~>,但我还是尝试了另一种方式:

data Entry t = [Char] & t

又一次因为解析错误而失败了。我觉得这很让人困惑,因为出于某些莫名其妙的原因,下面的代码却可以正常运行:

data Entry t = String :> t

这是否意味着中缀类型构造器中可能出现某些字符的特定规则,还是一种误解?我不是 Haskell 新手,也知道使用第一个构造器更符合惯用法,但这个问题让我困扰,而且似乎是我缺失的 Haskell 重要部分。请注意,保留HTML标记。

2
离题了,但是:“字典t”与“Python字典、Ruby哈希映射等完全不同”。它只是一个链表,没有别的。 - gspr
我不同意。我的计划是创建多个函数以及单子和函子实例,使我能够搜索某些可能失败的结果,而不会过度使用 Maybe。这是容易的部分,但这一点我不理解。 - AJF
1
@gspr所说的是以下几点不同之处:您不能(直接)在同一个字典中存储StringInt,查找时间最坏为线性时间,您无法进行破坏性更新(并且您永远不会获得漂亮的dict[key]语法)。因此它并不像您提到的数据结构... - yatima2975
1个回答

9
任何以冒号 : 开头的运算符都是类型构造函数或数据构造函数,但减号和大于号组成的 (->) 是例外。如果您想要波浪线,可以使用 :~>,但不能使用不以冒号开头的运算符。 来源

严格来说,_类型级运算符_是指出现在=符号的左侧的运算符。这需要一个LANGUAGE编译指令。 - MathematicalOrchid
@MathematicalOrchid 好一些了吗? - bheklilr
8
我认为:可以看作是.的“大写”版本,正如我们所知道的Haskell构造函数必须以大写字母开头...;-) - chi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接