天天看點

Haskell 基礎題解(01)列印九九乘法表

列印九九乘法表

初學 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 可以接受一個清單,把清單中的元素用 ++ 運算符連接配接起來。這是模拟其它語言中很常用的字元串拼接大法。