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
<< 回到主頁