2013-01-31 49 views
3

我想知道Haskell運算符%做了什麼。在谷歌很難找到,我也無法在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

+2

它不是內置的 - 該代碼將其定義爲'zZ%zz = zZ zz $ zZ%zz',它具有類型'(t - > t1 - > t1) - > t - > t1' – Lee

+0

我可以像這樣定義它自己,例如?:a%b = a + b?酷的 – RobAu

回答

8

這裏是Haskell的報告the relevant section

哈斯克爾提供了特殊的語法來支持中綴表示法。運算符是一個可以使用中綴語法應用的函數(部分3.4),或者部分應用部分應用(部分3.5)。

運算符可以是運算符符號,如+$$,或者是以重音符號(反引號)包含的普通標識符,如「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中的「運算符」沒有什麼特殊之處。名稱由符號構成的函數默認爲中綴,名稱爲字母數字的函數默認爲前綴,並且可以在其他樣式中使用一些額外的語法。順便說一下,由於通常不可能根據使用Google的運營商名稱進行搜索,因此要查找在標準庫中聲明的運營商,在Hackage上專門針對​​有兩個search engines

+0

+1引用的哈斯克爾報告 – Ingo

5

一般情況下,我們可以定義一個新的功能foo就像這樣:

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

同樣,我們可以定義一個二元運算符%(由符號字符的任意組合構成),如下所示:

a % b = (something involving a and b)