只是在這裏和Haskell一起掙扎......我有一個非常糟糕的術語,並且考慮到我的母語不是英語,所以做出正確的搜索有點複雜:P我跟着一些haskell教程/書(學習你一個Haskell ,真實世界哈斯克爾,快樂學習哈斯克爾,也是一個郵件列表,以及一些隨機頁),現在我在這裏停止:Haskell:模式匹配(x:_):爲什麼列表頭與x有界?
head' :: [Char] -> Char
head' (x:_) = x
該函數接收字符串類型的元素的列表,如果我申請它是這樣的:
head' "hello"
它返回「h」,它與x綁定,「ello」與_綁定,但它不包含因爲我不使用它。我知道(:)函數(或用作中綴運算符)會收到一個將被放置的元素和一個新列表的開始,它們的尾部將是另一個接收到的元素: 'a' : ['b', 'c']
將返回「abc」但是,爲什麼當我在括號內使用「:」時,第一個元素被綁定到x,其餘的是_?這裏發生了什麼?
我讀了幾SO類似這樣的問題(x:xs) pattern Haskell logic,這(這是更接近回答我的問題,我認爲)What does (x:_) and [x:_] mean?,但是這最後一個被接受的問題說: 「:是列出一個構造函數,它接受新列表的頭部作爲其左側參數,尾部作爲其正確參數如果您將它用作此處的模式,則意味着您匹配的列表頭部會被賦予正確的模式,而尾部則會被賦予左側。 「」
「該列表的頭部給出右側,尾部向左」......它真的讓我感到困惑:如果頭部被賦予「_」而尾部被賦予「x」時在模式匹配上使用「:」,爲什麼x有價值名單頭?
我想也許是我的英語水平很差,這讓我很難理解這個哈哈。我還可以享受一些提示(如特定搜索),而不是一個直接的答案:)
謝謝:)
編輯:對於另一個小白象我....由公認的答案說,「abcd」只是'a':'b':'c':'d',模式(x:_)匹配'a':'b'等,下劃線表示「我不在乎關於其餘的「,並接收其餘的角色。只是,:)
它必須是一個錯誤,左邊的部分必須匹配列表的頭部。 –
這是一個錯字。現在已經修復了。 – sepp2k
@EarlGray好吧,我現在感覺好多了,我認爲哈哈。但我仍然不明白:爲什麼尾巴與_有關? Haskell自動讀取「(x:_)」並且說:「好吧,我會把頭部綁定到x,其餘的是_」?或者「:」用於括號之間的模式匹配時有不同的含義嗎?因爲我的理解(x:_)是「把x放在_的開始處」... 這可能是一個愚蠢的問題,對不起:) –