2010-12-19 219 views
4
head' :: [a] -> a 
head' [] = error "No head for empty lists!" 
head' (x:_) = x 

head' :: [a] -> a 
head' xs = case xs of [] -> error "No head for empty lists!" 
         (x:_) -> x 

我在問一個相當容易的問題,我不明白。 在上面的代碼中,我看到它需要一個輸入列表。 但在第三行,它說(x:_)這讓我困惑。 任何人都可以向我解釋他們爲什麼寫(x:_)而不是[x:_](x:_)和[x:_]是什麼意思?

加上,我不明白什麼(x:_)意味着什麼。

謝謝。

+2

這是一個提示:'(x:_)'具有類型'[a]','[x:_]'具有類型[[a]]'。 – delnan 2010-12-19 11:47:49

回答

5

這是一個叫做pattern matching的概念。 :是一箇中綴構造函數,就像+是一箇中綴函數。在Haskell中,模式與構造函數匹配。

(1 : 2 : 3 : []) 

[1, 2, 3]相同,方括號表示法只是用於創建列表的語法糖。

您的模式(x : _)意味着您想要將列表的第一個元素綁定到x,並且您不關心列表_的其餘部分。

+0

謝謝Adamse。我也想知道syntally sugar是什麼意思。英語不是我的第一語言。 – tpark 2010-12-19 11:46:13

+2

http://en.wikipedia.org/wiki/Syntactic_sugar – bruno 2010-12-19 11:47:51

14

:是列表的構造函數,它將新列表的開頭作爲左側參數,將尾部作爲其右側參數。如果你將它用作這裏的模式,這意味着你匹配的列表的頭部被賦予左邊的模式,尾部賦予給右邊。

因此,在這種情況下,列表的頭部存儲在變量x中,尾部未使用(_表示您不關心該值)。

是的,你也可以使用[]模式匹配列表,但只有固定大小的列表。例如,模式[x]與只有一個元素的列表相匹配,然後將其存儲在變量x中。同樣,[x,y]會與包含兩個元素的列表匹配。

您建議的模式[x:y]將因此匹配一個列表與一個元素匹配的模式x:y。換句話說,它將匹配包含恰好一個列表的列表列表。

+0

感謝您的評論。我不知道有一本書或一個網站,你推薦Haskell新手嗎? – tpark 2010-12-19 12:03:34

+2

谷歌爲你學習haskell。 – fuz 2010-12-19 13:01:28

+0

@tpark:這個網站包含了很多關於學習Haskell的建議。這似乎是每隔一週就會彈出一個問題。這兩個問題提供了一些有用的答案:[「如何學習Haskell」](http://stackoverflow.com/questions/1012573/how-to-learn-haskell)和[「初學者指南Haskell」](http:///stackoverflow.com/questions/16918/beginners-guide-to-haskell)。此搜索可能會爲您提供更多有用的資源:[「learn haskell」](http://stackoverflow.com/search?q=learn+haskell)。我很享受[學習你一個Haskell](http://learnyouahaskell.com/)。 – adamse 2010-12-19 23:34:56

相關問題