2006/08/06

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) 數對,其中 xy 屬於 RxyR 裡面的所有數)」,而 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。

Blogger yen38/07/2006 12:48 pm 說:

偉哉~~~vi~~~
事實上本文還沒看..XD

 

<< 回到主頁