我想知道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")
Run Code Online (Sandbox Code Playgroud)
取自:https://codegolf.stackexchange.com/questions/88/obfuscated-fizzbuzz-golf/110#110
以下是Haskell报告的相关部分:
Haskell提供了特殊的语法来支持中缀表示法.运算符是一个函数,可以使用中缀语法(第3.4节)应用,或部分应用于节(第3.5节).
运算符是运算符符号,例如
+or$$,或者是包含在严重重音符(反引号)中的普通标识符,例如`op`.例如,op x y可以编写中缀应用程序,而不是编写前缀应用程序x `op` y.如果没有给出固定声明,`op`那么它默认为最高优先级和左关联性(参见第4.4.2节).通过将操作符号括在括号中,可以将其转换为普通标识符.例如,
(+) x y等同于x + y,foldr (*) 1 xs等同于foldr (\x y -> x * y) 1 xs.
也就是说,除了语法之外,Haskell中的"运算符"没有什么特别之处.名称由符号组成的函数默认为infix,名称为字母数字的函数默认为prefix,并且可以在其他样式中使用一些额外语法.
顺便说一句,由于通常不可能使用Google进行基于运营商名称的搜索,因此要查找标准库中声明的运算符,有两个专门用于在Hackage上查找内容的搜索引擎.
通常,我们可以foo像这样定义一个新函数:
foo a b c = (something involving a, b, and c)
Run Code Online (Sandbox Code Playgroud)
类似地,我们可以定义一个二元运算符%(由符号字符的任意组合构成),如下所示:
a % b = (something involving a and b)
Run Code Online (Sandbox Code Playgroud)