列印九九乘法表
初學 haskell 的關鍵是:
掌握函數式思考問題
的技藝
haskell 是純函數式的語言,它的函數基本與數學上的函數等價:
- 給同樣的輸入,總是得到相同的輸出。
- 函數保證沒有副作用,除了計算出結果,啥都不做
- 函數的求值次序無法控制
- 函數求值是惰性的,隻要還沒被用到,絕不去求值
要改變現實世界(比如螢幕上的像素點),總要有點副作用才行。haskell 的理念是:把純函數與有副作用的函數分開。盡可能壓縮有副作用的函數的生存空間。
九九表的問題中,有副作用的函數功能是:輸出一個串(含有很多換行符的串)。但,如何制造出這個串,就是一個純函數問題。
下面是 haskell 實作:
----- 輸出乘法口訣表
table = [f x y | x <- [1..9], y <- [1..9], x >= y] where
f x y = concat [show x, "*", show y, "=", show (x*y)
,if x==y then "\n" else " "]
main = putStr $ concat table
haskell 的函數調用的表示法很有特色: f x y
相當于大多數其它語言中的 f (x,y)
函數調用有最高的優先級。 f x y + g x 的意思是:
(f x y) + (g x)
table 是一個包含字元串的表(類型:[String]),它的每一項是一句乘法口訣。
它的核心算法是用一個清單推導式,這個與python中類似。haskell的表示 法,更接近數學上集合的表示方法。豎線左邊是右邊那些源集合的笛卡爾積。最右一項不是源集,是過濾條件。
concat 可以接受一個清單,把清單中的元素用 ++ 運算符連接配接起來。這是模拟其它語言中很常用的字元串拼接大法。