Haskell 最有代表性的一段程序是什麼?


import Control.Monad
import Control.Monad.Instances

isPrime= ap (all.((0/=).).mod) $ flip takeWhile primes.(.join(*)).flip(&<=) primes= 2:filter isPrime[3,5..]

幾年前一位大俠從HaskellWiki上摘來的。當年第一次推通,明白它的原理時,內心非常激動。

優美的地方在於,兩個函數互相嵌套定義,並且都是有意義的,primes 返回一個無窮素數數列,isPrime是個檢驗給定數是否素數的判別函數。這段定義也充分利用了lazy evaluation,所以覺得較有代表性。

這段代碼的意思就是這一句定義:素數是模上素因子不等於0的數


main :: IO ()
main = putStrLn "Hello world"

上邊的程序不難理解,難理解的在於IO (),同時代表了Haskell純潔性與Monad。

如果想展示直觀,mergesort,quicksort,insertation sort都不錯。

另外生成全部素數的程序,用那個篩子實現相當容易,只有兩行,體現了Haskell惰性求值還有函數式的特點。無需額外的庫函數,如果有任何語言能寫得比這個更漂亮或者精簡的,請私信聯繫我。

primes = sieve [2..]
sieve (p:xs) = p : sieve [x| x &<- xs , mod x p /=0 ]

Haskell有很多虐腦的程序,比如 @Tang Boyun 的那段。之前有個網站專門整理過,叫Haskell brainfucker還是什麼。但是這4行展示了幾乎Haskell所有的特點,純潔、函數式、惰性求值、Monad(原諒我把Monad變成Haskell的「特性")。


話說我一直覺得 qsort 的這代碼不是很完美,為什麼要 filter 兩次而不是 filter 一次把滿足條件的和不滿足條件的分開?更喜歡這樣的 qsort:

qsort :: Ord a =&> [a] -&> [a]
qsort [] = []
qsort (x:xs) = qsort lhs ++ [x] ++ qsort rhs
where (lhs, rhs) = partition (&< x) xs

很多語言的 qsort 範例都是 filter 兩次,感覺不解。


qsort [] = []
qsort (x:xs) = qsort (filter (&< x) xs) ++ [x] ++ qsort (filter (&>= x) xs)


fib = 1:1:zipWith (+) fib (tail fib)


import Control.Monad (filterM)
powerSet = filterM $ const [True, False]


推薦閱讀:

國內有哪些公司用Haskell做網站後端的?
Haskell 有哪些威力十足的庫?
有沒有比較實用、成熟的 Haskell 應用?
使用 Cabal hook 構建複雜 Haskell 項目

TAG:函數式編程 | Haskell |