《Two Dozen Short Lessons in Haskell》學習(十三)迭代及重複的常規模式

weixin_34321977發表於2013-01-04

《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

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_list

解釋一下:

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就是隨機數種子

相關文章