2013-11-27 90 views
5

正如文章標題說,我確定在Haskell以下功能列表:哈斯克爾模式匹配元組

prop_LeftInverse :: (Eq a, Eq b) => [(a,b)] -> Bool 
prop_LeftInverse (x,y):(xs,ys) = undefined 

應作爲輸入的元組的列表。我得到一個parse error in pattern但我不能完全弄清楚它是什麼,也沒有發現有關此特定情況下,任何信息......

回答

9

差不多吧:

prop_leftInverse ((x, y):rest) = undefined 

首先, ,你需要在整個模式中使用括號。其次,列表中的第一個元素是一個元組,但列表的其餘部分只是元組列表,而不是元組列表。

如果你看一下簡單的模式匹配的通用列表

head :: [a] -> a 
head [] = error "Empty list" 
head (x:xs) = x 

對這個工程的所有類型a類型的所有值,或。如果你想要一個特定的類型,如Int,你可以做

headIsOne :: [Int] -> Bool 
headIsOne (1:xs) = True 
headIsOne _ = False -- Here the _ matches anything 

所以,如果你想匹配一個元組:

addTup :: (Int, Int) -> Int 
addTup (x, y) = x + y 

我們看到的是模式匹配元組是究竟如何我們在代碼中編寫一個代碼,所以要在列表的開頭匹配一個,我們只需要將第一個元素與特定模式匹配即可。

prop_leftInverse ((x, y):rest) = undefined 

列表的其餘部分被分配到rest(儘管你可以稱它爲任何你想要的)。


又如

如果你想搶得頭兩個元:

myFunc ((x, y):(v, u):rest) = undefined 

漲幅前三:

myFunc ((x1, y1):(x2, y2):(x3, y3):rest) = undefined 

現在我希望你能看到的模式(得到它?)

+0

這非常詳細,謝謝! –