Haskell模式匹配元组列表

时间:2013-11-27 19:20:56

标签: haskell

正如帖子标题所说,我在Haskell中定义了以下函数:

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

应该将元组列表作为输入。我得到一个parse error in pattern,但我无法弄清楚它是什么,也没有找到关于这个具体案例的任何信息......

1 个答案:

答案 0 :(得分:14)

几乎是对的:

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

到现在为止,我希望你能看到模式(得到它吗?)