2012-05-15 98 views
0

我試圖從Haskell Road to Logic 學習Haskell和跨越這個例子就是:模式匹配遍歷列表

mnmInt :: [Int] -> Int 
    mnmInt [] = error "empty list"· 
    mnmInt [x] = x 
    mnmInt (x:xs) = min x (mnmInt xs) 

我瞭解的功能需要的Int列表 - 檢查是否爲空 如果不是 檢查它是否爲帶有1個int的列表,如果是的話返回x 如果不是的話 插入mnmInt並將xs參數設置爲min。

它是如何到達基本情況? xs代表什麼?

分鐘實現:

min' :: Int -> Int -> Int 
    min' x y | x <= y = x 
      | otherwise = y 

不採取的陣列。

回答

5

(x:xs)是模式匹配語法。模式匹配可讓您「解構」數據類型並將其綁定到名稱。在這種情況下,x是列表的頭部,xs是尾部。 min'不需要列表,因爲x是列表的頭部,而不是列表本身。

min'自身查找兩個Ints之間的最小值,mnmInt最終將擴展出類似(min' 1 (min' 2 (min' 3 4)))如果你在一個看起來像[1,2,3,4]列表通過。

如果您親自評估代碼,我強烈建議您嘗試一下,這很容易看出。請記住,(x:xs)是兩個名稱,它們是列表的頭部和尾部。您可能想使用構建列表來玩弄:

下面是一個示例,顯示模式匹配如何與代碼流相關。

foo (x:y:[]) = "two" 
foo ([]) = "none" 
foo (_) = "some other value" 

如果你調用foo [1,2]它將輸出「兩節」,如果你這樣做foo [1,2,3]它會給你「其他值」,如果你這樣做foo []它將返回"none"

+0

我明白遞歸。我想我沒有得到模式匹配 匹配每個元素分離地類似於grep。 (或者它是一個正則表達式的東西?) – raam86

+0

好吧,我不確定你是否明白這一點。模式匹配與正則表達式無關,儘管您可以通過使用'case'來匹配正則表達式匹配的結果。它只是試圖尋找一種與你寫的模式相匹配的類型。 – Wes

+0

所以(x:xs)結構與頭部和尾部匹配的任何列表? 如果是這樣 - 什麼花費名單?它如何知道迭代? – raam86

1

你可以寫一個清單在Haskell中有兩種方式,第一種類似[1,2,3,4,5],其中1:2:3:4:5:[]只是syntagtik糖。 現在的模式(X:XS)用這樣的列表匹配:

head(x:xs) = x 
    --> head [1,2,3,4,5] = head 1:2:3:4:5:[] = head 1:xs = 1 

我希望這個例子清楚地告訴你一個列表模式是如何工作的。