[Haskell筆記]cons

很多情況下,我們通過在舊的(已經構造好的)list上增加新成員來構造一個新的list。在Haskell中,我們稱這為把成員cons到list上。我們使用“:”這個控制符來表示這個操作。

Prelude> let numbers = [1,2,3,4]
Prelude> numbers
[1,2,3,4]
Prelude> 0:numbers
[0,1,2,3,4]

cons所得的結果仍然是一個list,所以我們可以繼續cons成員上去。例如:

Prelude> 1:0:numbers
[1,0,1,2,3,4]
Prelude> 2:1:0:numbers
[2,1,0,1,2,3,4]
Prelude> 5:4:3:2:1:0:numbers
[5,4,3,2,1,0,1,2,3,4]

事實上,listnumbers本身(即[1,2,3,4])就可以寫成1:2:3:4:[]的形式。也就是說,所有list都是通過把成員cons到一個空list(用[]表示)上得到的。所以,[成員1,成員2]的表示list的形式并不是不可缺少的,僅僅起到表示起來更方便、看起來更清楚之類的作用,我們把這類表達叫做“語法糖衣”(Syntax Sugar)。

練習

7.1 將6.1中的list改寫成cons到空表的形式。

7.2 3:[True,False]這樣的表達成立嗎?為什麽?

7.3 寫一個函數cons8,將8 cons到輸入的list上。用以下例子測試你的函數:

cons8 []
cons8 [1,2,3]
cons8 [True,False]
let foo = cons8 [1,2,3]
cons8 foo

7.4 寫一個函數,以一個list和一個成員作為輸入,將輸入的成員cons到輸入的list上。


答案

    1. [12, 80]成立。12和80都是Integer。
    2. [42, "life, universe and everything else"]不成立。一個是Integer,一個是String。
    3. ["beer", "sandwiches"]成立。都是String。
    4. [5, 4.5]成立。都是Double。(在這種情況下,Haskell能判斷出5應當作為Double看待,而不是Integer。)
    5. ["45", "True"]成立。都是String。
    6. [pi, 56]成立。都是Double。(pi是一個符號,符號的類型由其代表的值決定。)

Leave a Reply