[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上。
答案
- [12, 80]成立。12和80都是Integer。
- [42, "life, universe and everything else"]不成立。一個是Integer,一個是String。
- ["beer", "sandwiches"]成立。都是String。
- [5, 4.5]成立。都是Double。(在這種情況下,Haskell能判斷出5應當作為Double看待,而不是Integer。)
- ["45", "True"]成立。都是String。
- [pi, 56]成立。都是Double。(pi是一個符號,符號的類型由其代表的值決定。)
Leave a Reply