《Two Dozen Short Lessons in Haskell》(Copyright © 1995, 1996, 1997 by Rex Page,有人翻譯為Haskell二十四學時教程,該書如果不用於贏利,可以任意釋出,但需要保留他們的copyright)這本書是學習 Haskell的一套練習冊,共有2本,一本是問題,一本是答案,分為24個章節。在這個站點有PDF檔案。幾年前剛開始學習Haskell的時候,感覺前幾章還可以看下去,後面的內容越來越難以理解。現在對函數語言程式設計有了一些瞭解後,再來看這些題,許多內容變得簡單起來了。
初學Haskell之前一定要記住:
把你以前學習程式導向的常規的程式語言,如Pascal、C、Fortran等等統統忘在腦後,函數語言程式設計完全是不一樣的程式設計模型,用以前的術語和思維來理解函數語言程式設計裡的概念,只會讓你困惑和迷茫,會嚴重地影響你的學習進度。
這個學習材料內容太多,想把整書全面翻譯下來非常困難,只有通過練習題將一些知識點串起來,詳細學習Haskell還是先看其它一些入門書籍吧,這本書配套著學學還是不錯的。
第十三章 Iteration and the Common Patterns of Repetition
這一章開始接觸平常程式語言中不可想象的無限資料結構,利用iterate函式可以產生一個無限元素的列表。
iterate函式接受2個引數,假設為iterate f x
第一個引數本身是一個函式,輸入為a型別,輸出還是a型別。(這裡以a是整數來舉例)
第二個引數是一個值(型別為a)
輸出為一個無限列表,列表中的元素都是a型別,第一個元素就是x,第二個元素是f x,第三個元素是f (f x),第四個元素是f (f (f x)......
例如:
函式f的定義如下:
f x = x + 2
那麼iterate f 0就是輸出結果:
[0, 2, 4, 6, 8, ...]
如果你在ghci互動視窗中試驗該命令,則視窗中不停地輸出偶數,直到你按CTRL+C才能打斷它。
解釋一下:
iterate f 0這個函式有2個引數,第一個引數是f,第二個引數是0
第一個元素就是0,第二個元素呼叫f 0(即2),第三個元素呼叫f 2(即4),以此類推
1 The iterate function
a delivers an infinite sequence as its value
b applies a function to the value that function delivers, over and over
c delivers its second argument as the first element of a sequence
d all of the above
2 What value do the following Haskell commands deliver?
HASKELL DEFINITION • add2 n = n + 2
HASKELL COMMAND • iterate add2 0
HASKELL COMMAND • iterate add2 1
a the biggest number that Haskell can compute
b nothing — they aren’t proper commands
c the number that is two more than the starting point
d one delivers the sequence of even numbers, the other the odds
3 Use the iterate function to generate the sequence [x0, x1, x2, x3, …] where x0 = 1 and xn+1 = 11xn mod 127.
a next x = x/127 * 11
iterate next 1
b next x = (11*x) ‘mod‘ 127
iterate next (1/11 ‘div‘ 127)
c next x = (11*x) ‘mod‘ 127
iterate next 1
d none of the above
=========================================================
答
案
在
下
面
=========================================================
1 d
iterate得到一個無限的序列
不停地呼叫函式f
第一個元素的結果作為輸入,繼續呼叫函式f,得到第二個元素
2 d
在Haskell中可以直接用列表寫出一個無限序列:
[0, 2..]
也同樣可以得到偶數的無限序列
同理,用[1,3..]可以得到奇數序列
3 c
這裡實際上就是一個偽隨機數生成器,x0就是隨機數種子