Oh My Gosh!
Haskell is beautiful!! 看看這個 Fibonacci 數列函式定義:
fibs :: [Int] fibs = 0 : 1 : [ a + b | (a, b) <- zip fibs (tail fibs)]
第一行說 fibs 這個函式的(回返)型別是 list of Int。第二行是 fibs 的定義:
- '
:' 是 list concatenation,e.g.[1, 2] : [3, 4] = [1, 2, 3, 4],所以fibs這個 list 的前兩個元素是 0 和 1,後面是另一個 list。 - 後面這個 list 的語法很像數學上集合的記號。數學上我們寫
{(x, y) | x, y \in R},說的是「這個集合內放的是(x, y)數對,其中x和y屬於R(x和y是R裡面的所有數)」,而 Haskell 此處的寫法是「這個 list 內放的是a + b的值,其中(a, b)tuple 是 "zip fibs (tail fibs)" 這個 list 的所有元素」。 - 最後,
zip會把兩個 lists 同一位置的元素綁在一起形成一個 tuple,例如zip [1, 2, 3] [4, 5, 6] = [(1, 4), (2, 5), (3, 6)]。而tail會回返一個 list 捨棄第一個元素的結果,因此zip fibs (tail fibs)(不覺得這段很像 Lisp 嗎 XD)這個 list 的第一個元素是(0, 1),然後是(1, 1),再來是(1, 2),無止盡地下去。沒錯,recursion 已經進來了,而且姿態輕盈又優雅。因為 Haskell 的 lazy evaluation 特性,fibs所代表的 list 長度雖然無窮長,但只會產生使用者要求的值。
神妙無比!Wonderfully elegant!
--
不用說,偉大的 vi 又認得 .hs 檔案了 XD。


偉哉~~~vi~~~
事實上本文還沒看..XD
<< 回到主頁