Haskell/解決方案/列表和元組
外觀
| 練習 |
|---|
let myCons list thing = |
- 這將無法正常工作。[True, False]是一個布林值列表,3是一個整數。
let cons8 list = 8:list、let cons8 = (:) 8和let cons8 list = (:) 8 list都是有效的函式。cons8 []返回[8]cons8 [1,2,3]返回[8,1,2,3]cons8 [True,False]會導致型別錯誤。這與練習 1 中的錯誤相同。let foo = cons8 [1,2,3]不會輸出任何訊息,但 foo 為[8,1,2,3]。試試看!cons8 foo(假設你完成了 2.4)返回[8,8,1,2,3]
- 正如我們所知,
let cons8 list = list:8無法正常工作,因為 8 不是列表,但let cons8 list = list ++ [8]會正常工作,因為 (++) 會連線兩個列表 let myCons list thing = thing : list、let myCons list thing = (:) thing list都是有效的函式。
| 練習 |
|---|
|
- 1 和 2 不是有效的 Haskell 程式碼,3 是有效的
1:2:3:[]:[]。1、2和3是整數,而[]是一個列表。1:(2:3:[]):4:[]。同樣,1和4是整數,而2:3:[]是一個整數列表。(1:2:3:[]):[]:[]。這是有效的 Haskell 程式碼,因為1:2:3:[]是一個整數列表,而[]是一個空列表(任何型別)。
- 前四個是有效的 Haskell 程式碼。第五個不是。
[[],[1,2,3],[4,5,6]]。[1,2,3]和[4,5,6]都是整數列表。整個列表是一個整數列表的列表。我們可以將一個空列表(任何型別)連線到它的前面。[[]]。不是空列表!。這是一個包含一個空列表的列表。該列表本身不是空的,因為它有一個元素![[],[]]。這是一個包含兩個空列表的列表。[[1],[]]。這與前一個列表相同,只是第一個元素為[1],而不是[]。由於該列表是一個列表的列表,它現在已成為一個整數列表的列表。[["hi"], [1]]。["hi"] 是一個字元列表,而 [1] 是一個整數列表。
- 是的,這是可能的。例如:
[[[1],[2],[3]],[[4],[5],[6]],[[7],[8],[9]]]。為什麼?你可以建立一個任何型別的列表!如果你已經有一個某種型別的列表,那麼你可以建立一個該型別列表的列表。示例列表將寫成:((1:[]):(2:[]):(3:[]):[]):((4:[]):(5:[]):(6:[]):[]):((7:[]):(8:[]):(9:[]):[]):[] - 列表
[[1,2],3,[4,5]]無效,因為它等效於(1:2:[]):3:(4:5:[]):[],我們嘗試連線不同型別的元素(即列表和數字)。Haskell 中的列表必須是型別同質的。有效的列表將是[[1,2],[3],[4,5]],等效於(1:2:[]):(3:[]):(4:5:[]):[]。
| 練習 |
|---|
|
(4,"hello",True)- 它們都是有效的!元組不受型別的限制。
- 一個包含兩個整數的元組。
- 一個包含一個整數和一個字串的元組。
- 一個包含一個布林值和兩個字串的元組。
- 空元組
()被稱為“單位”
-
- 也許 Haskell 的建立者希望限制元組的功能,以避免過度使用它們。使用可連線的元組而不是列表和元組來提供函式引數的習慣,可能使函式變得更加複雜,因此更難閱讀、編寫和維護。
- 與列表不同,我們將獲得一個具有不同型別的元組,因為元組的大小將更大。
| 練習 |
|---|
|
-
- 無效。
(2,3)是一個元組,而連線(:)僅適用於列表。 - 無效。
(2,3)是一個元組,而連線(:)僅適用於列表。 - 有效。你將得到一個包含一個整數和一個整數的元組的列表:
[(2,4)] - 無效。列表的所有元素必須是相同型別。
(2,4)和(5,5)是包含一個整數和一個整數的元組,但('a','b')是包含一個字元和一個字元的元組。 - 有效。這是一個包含一個整數列表和一個整數列表的元組。
- 無效。
| 練習 |
|---|
|
snd (fst (("Hello", 4), True))返回4。- 是的,我們可以!元組和列表之間的區別在於,列表的所有元素必須是相同型別(整數、布林值等),但你可以向列表新增元素。元組的元素可以是任何你想要的型別,例如
(4, 'a')中的整數和字元的元組,但你不能更改其大小。 headAndTail list = (head list, tail list)
- 此實現的缺點包括定義的笨拙性、缺乏通用性(如果我們想獲取第四個、第六個或第十九個元素呢?)、以及它會在傳入一個元素少於五個的列表時導致程式崩潰的事實。
fifthElement list = head (tail (tail (tail (tail list))))
| 練習 |
|---|
|
為以下函式提供型別簽名
|
headAndTail :: [a] -> (a, [a])
fifthElement :: [a] -> a
h x y z :: Int -> a -> b -> Char -- y and z are not actually used, so their types could be anything