正如帖子标题所说,我在Haskell中定义了以下函数:
prop_LeftInverse :: (Eq a, Eq b) => [(a,b)] -> Bool
prop_LeftInverse (x,y):(xs,ys) = undefined
Run Code Online (Sandbox Code Playgroud)
应该将元组列表作为输入.我得到了一个,parse error in pattern
但我无法弄清楚它是什么,也没有找到关于这个具体案例的任何信息......
bhe*_*ilr 15
几乎是对的:
prop_leftInverse ((x, y):rest) = undefined
Run Code Online (Sandbox Code Playgroud)
首先,你需要围绕整个模式的括号.其次,列表中的第一个元素是一个元组,但列表的其余部分只是一个元组列表,而不是一个列表元组.
如果您查看通用列表上的简单模式匹配
head :: [a] -> a
head [] = error "Empty list"
head (x:xs) = x
Run Code Online (Sandbox Code Playgroud)
这适用于所有类型的值a
或所有类型.如果你想要一个特定的类型,比如Int
,你可以做到
headIsOne :: [Int] -> Bool
headIsOne (1:xs) = True
headIsOne _ = False -- Here the _ matches anything
Run Code Online (Sandbox Code Playgroud)
所以,如果你想匹配一个元组:
addTup :: (Int, Int) -> Int
addTup (x, y) = x + y
Run Code Online (Sandbox Code Playgroud)
我们看到匹配元组的模式正是我们在代码中编写一个的模式,所以为了匹配列表开头的一个,我们只需要将第一个元素与特定模式匹配.
prop_leftInverse ((x, y):rest) = undefined
Run Code Online (Sandbox Code Playgroud)
列表的其余部分被分配给rest
(尽管您可以随意调用它).
另一个例子
如果你想抓住前两个元组:
myFunc ((x, y):(v, u):rest) = undefined
Run Code Online (Sandbox Code Playgroud)
或者前三个:
myFunc ((x1, y1):(x2, y2):(x3, y3):rest) = undefined
Run Code Online (Sandbox Code Playgroud)
到现在为止,我希望你能看到模式(得到它?)