3

我想知道 Haskell 运算符 % 是做什么的。在谷歌上很难找到,我在 Haskell 报告中也找不到。

我在这段代码中看到了它:

 fi=zz.bu
 bu=zz.(:).(++"zz")
 []#zz=zz;zz#__=zz
 zZ%zz=zZ zz$zZ%zz
 zz=(([[],[]]++).)
 zZ=zipWith;z=zZ((#).show)[1..]$zZ(++)(bu%"Fi")(fi%"Bu")

取自:https ://codegolf.stackexchange.com/questions/88/obfuscated-fizzbuzz-golf/110#110

4

2 回答 2

8

这是Haskell 报告的相关部分:

Haskell 提供了特殊的语法来支持中缀表示法。运算符是一个函数,可以使用中缀语法(第 3.4 节)应用,或使用节部分应用(第 3.5 节)。

运算符要么是运算符符号,例如+or $$,要么是包含在重音符号(反引号)中的普通标识符,例如 `op`。例如,不用写前缀 application ,而是op x y写中缀 application x `op` y。如果没有给出固定性声明,`op`则默认为最高优先级和左关联性(参见第 4.4.2 节)。

对偶,运算符符号可以通过将其括在括号中转换为普通标识符。例如,(+) x y等价于x + y,并且foldr (*) 1 xs等价于foldr (\x y -> x * y) 1 xs

也就是说,Haskell 中的“操作符”除了语法之外并没有什么特别之处。名称由符号组成的函数默认为中缀,名称为字母数字的函数默认为前缀,两者都可以在其他样式中使用,但需要一些额外的语法。

顺便说一句,由于使用 Google 通常无法根据运算符名称进行搜索,因此要查找在标准库中声明的运算符,有两个专门用于在 Hackage 上查找内容的搜索引擎。

于 2013-01-31T20:35:40.107 回答
5

一般来说,我们可以foo像这样定义一个新函数:

foo a b c = (something involving a, b, and c)

类似地,我们可以定义一个二元运算符%(由符号字符的任意组合构成),如下所示:

a % b = (something involving a and b)
于 2013-01-31T20:35:19.740 回答