2013-11-27 156 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

这非常详细,谢谢! –