2016-07-23 83 views
0

只是在這裏和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'等,下劃線表示「我不在乎關於其餘的「,並接收其餘的角色。只是,:)

+0

它必須是一個錯誤,左邊的部分必須匹配列表的頭部。 –

+0

這是一個錯字。現在已經修復了。 – sepp2k

+0

@EarlGray好吧,我現在感覺好多了,我認爲哈哈。但我仍然不明白:爲什麼尾巴與_有關? Haskell自動讀取「(x:_)」並且說:「好吧,我會把頭部綁定到x,其餘的是_」?或者「:」用於括號之間的模式匹配時有不同的含義嗎?因爲我的理解(x:_)是「把x放在_的開始處」... 這可能是一個愚蠢的問題,對不起:) –

回答

7

列表數據類型的定義如下:

data [a] = [] | a : [a]

這意味着a秒的列表爲空,或磁頭元件使用:附接至尾部元件(cons)構造函數。

當您在列表中匹配模式時,可以爲這兩種情況中的每一種定義函數。在head'的情況下,它只是在給出空列表時失敗,所以我們只匹配一個案例:a : [a]案例。

如果你叫head' "hello"(因爲它現在存在,與包括類型簽名)應該失敗,因爲"hello"實際上是一個String - 一個別名在Haskell [Char]。「你好」僅僅是下面的結構語法糖:

"hello" = 'h':'e':'l':'l':'o':[]

因此,使用head'名單上,當你的模式匹配,你的第一:左側獲得'h',和的休息清單(我們不關心)綁定到_

+0

類型簽名有一個錯字,我的電腦中有原始代碼,所以我沒有複製粘貼它。它現在已經修復,對不起:) –

+0

經過一些編碼並重新閱讀你的問題和EarlGray的,我想我明白了:)非常感謝你的人。我非常感謝你的幫助:) –

+0

'data [a] = [] | a:[a]'有效?我無法在ghci中做這樣的事情:'data TestType = Integer | Integer:[Integer]' –

相關問題