我不明白 Haskell 如何將陣列解構為元組
例如,為什么這樣有效
head :: [a] -> a
head (x:xs) = x
但這不起作用
head :: [a] -> a
head [x:xs] = x
這對我來說不直觀
uj5u.com熱心網友回復:
(x:xs)不是元組,是(x, xs)2 元組的模式。是串列的where is(兩者之一)資料建構式的(x:xs)縮寫。另一個是空串列。((:) x xs)(:)[]
資料建構式有兩個欄位:第(:)一個(此處x)是指向串列第一項的頭部,第二個(此處xs)指向剩余元素的串列。所以這看起來像一個鏈表。
[x:xs]是 的一個簡短變體[(x:xs)],因此它與一個串列串列系結,其中外部串列??包含單個元素,并且該單個元素與(x:xs)一個非空串列匹配,該串列具有x唯一子串列的第一項,以及xs該串列的其余元素子串列。
uj5u.com熱心網友回復:
為什么這行得通
head :: [a] -> a head (x:xs) = x但這不起作用
head :: [a] -> a head [x:xs] = x
對于學習 Haskell 的人來說,這是一個非常常見的困難來源。在某些情況下,這些看起來相似,但含義不同:
type
[a]等價于[] a,意思是“零個或多個元素都具有 type 的串列的型別a”。模式
[p]等價于p : []and(:) p [],意思是“匹配與模式匹配的元素的串列p”。
請注意,末尾帶有變數的串列模式匹配任意數量的剩余元素,但如果它以“nil”結尾,[]則它匹配固定數量的元素。以下是長度為n的串列的一些示例:
xs— n ≥ 0 — 多于零個元素;任何清單p : xs— n ≥ 1 — 一個以上的元素;非空串列p? : p? : xs— n ≥ 2 — 兩個以上的元素p? : p? : p? : xs— n ≥ 3 — &c。- …
[]— n = 0 — 正好是零個元素;空串列[p]— n = 1 — 正好是一個元素;單例串列[p?, p?]— n = 2 — 正好兩個元素[p?, p?, p?]— n = 3 — &c。- …
x : xs與 相同的Writing(:) x xs匹配一個或多個元素的串列。把它放在括號中(x : xs)是等價的,它只是因為優先規則:head x : xs意味著(head x) : xs,這是一個有效的運算式,但不是一個有效的模式。
Writing與and[x : xs]相同,匹配一個元素串列(e),其中該元素匹配一個或多個元素的串列(e = )。這里有些例子:(x : xs) : [](:) ((:) x xs) [][ ]x : xs
let { x : xs = [1] } in (x, xs)評估為(1, [])因為:x:xs火柴1:[]x=1xs=[]
- 這些都是等價的:
[1]1 : [](:) 1 []
let { x : xs = [1, 2, 3] } in (x, xs)評估為(1, [2, 3])因為:x:xs火柴1:2 : 3 : []x=1xs=[2, 3]
- 這些都是等價的:
[1, 2, 3]1 : [2, 3]1 : 2 : [3]1 : 2 : 3 : [](:) 1 ((:) 2 ((:) 3 []))
let { x : xs = "hi" } in (x, xs)評估為('h', "i")因為:x:xs火柴'h':'i' : []x='h'xs="i"
- 這些都是等價的:
"hi"'h' : "i"'h' : 'i' : [](:) 'h' ((:) 'i' [])
let { [x : xs] = [[1]] } in (x, xs)評估為(1, [])因為:[x : xs]火柴[[1]]x:xs火柴1:[]x=1xs=[]
let { [x : xs] = ["yo"] } in (x, xs)評估為('y', "o")因為:[x : xs]火柴[["yo"]]x:xs火柴'y':'o' : []x='y'xs="o"
- 既不
x : xs也不[x : xs]匹配空串列[] [x : xs]不匹配,["ya", "no"]因為x : xs:[]不匹配"ya":"no" : [],因為[]不匹配"no":[][x : xs]不匹配[[]],因為x:xs不匹配[]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528499.html
標籤:哈斯克尔函数式编程
