正如帖子标题所说,我在Haskell中定义了以下函数:
prop_LeftInverse :: (Eq a, Eq b) => [(a,b)] -> Bool
prop_LeftInverse (x,y):(xs,ys) = undefined
应该将元组列表作为输入。我得到一个parse error in pattern
,但我无法弄清楚它是什么,也没有找到关于这个具体案例的任何信息......
答案 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
到现在为止,我希望你能看到模式(得到它吗?)