Haskell模式匹配元组列表

jl.*_*kon 9 haskell

正如帖子标题所说,我在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)

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