Haskell中的运算符%是什么意思?

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

这是一个FizzBuzz的编程挑战,要求输出1到100之间的数字,如果数字可以被3整除,则输出“Fizz”,如果数字可以被5整除,则输出“Buzz”,如果数字既可以被3又可以被5整除,则输出“FizzBuzz”。这个代码示例展示了一种使用JavaScript实现的最小化版本。

2
它不是内置的 - 该代码将其定义为 zZ%zz = zZ zz $ zZ%zz,并且具有类型 (t -> t1 -> t1) -> t -> t1 - Lee
我可以自己定义它,例如:a%b = a+b 吗?很酷。 - Rob Audenaerde
2个回答

8

这里是 Haskell 报告的 相关章节:

Haskell提供特殊语法以支持中缀表达式。运算符是一个函数,可以使用中缀语法(第3.4节)或部分应用(第3.5节)进行应用。 运算符是运算符符号,例如+$$,或者是用反引号(backquotes)括起来的普通标识符,例如`op`。例如,可以写入中缀应用程序x `op` y而不是写前缀应用程序op x y。如果没有给出`op`的优先级和左关联性声明,则默认为最高优先级和左关联性(请参见第4.4.2节)。
同样地,运算符符号可以通过括在括号中将其转换为普通标识符。例如,(+) x y等价于x + yfoldr (*) 1 xs等价于foldr(\x y -> x * y)1 xs
换句话说,Haskell中的“运算符”除了语法之外并没有什么特别之处。由符号组成名称的函数默认为中缀,由字母数字组成名称的函数默认为前缀,可以使用一些额外的语法在另一种风格中使用任何一种方式。
顺便提一下,由于使用Google无法根据运算符名称进行搜索,因此要查找在标准库中声明的运算符,有两个搜索引擎专门用于在Hackage上查找内容

5
一般来说,我们可以这样定义一个新的函数foo:
foo a b c = (something involving a, b, and c)

同样地,我们可以这样定义一个二元运算符%(由任意组合的符号字符构成):
a % b = (something involving a and b)

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