我试图从列表列表中解析记录(从this question继续)。
这是我的记录
data Record = Record Text Text Text Text Text Text Text Text Text deriving (Show, Generic)
此语法有效:
parseRecords :: [[Text]] -> [Record]
parseRecords = map (\[f1,f2,f3,f4,f5,f6,f7,f8,f9,_] -> Record f1 f2 f3 f4 f5 f6 f7 f8 f9)
这个语法检查,但我修复了10个参数。我宁愿能够拥有更多而且忽略那些更大的模式将它们匹配到[_]列表我不会传递。我尝试了以下方法:
parseRecords = map (\f1:f2:f3:f4:f5:f6:f7:f8:f9:[_] -> Record f1 f2 f3 f4 f5 f6 f7 f8 f9)
然而,这失败了:
Parse error (line 27, column 24): parse error on input ‘:’
我可以发誓我之前看过这种用于lambdas的模式匹配。我错过了我的冒号运算符是一个解析错误?很难质疑出了什么问题。
谢谢!
就像在函数绑定中需要关于模式的括号一样,
f (x:xs) = ...
你需要围绕lambda中的模式使用括号:
parseRecords = map (\ (f1:f2:f3:f4:f5:f6:f7:f8:f9:_) -> Record f1 f2 f3 f4 f5 f6 f7 f8 f9)
-------pattern----------------
------------------lambda function--------------------------------------
有时可以省略括号,但并非总是如此。列表模式是:
[] matches []
(x:xs) matches [x, ...] so that (x:xs) == [x] ++ xs
(x:y:xs) matches [x, y, ...] so that (x:y:xs) == [x] ++ (y:xs)
== [x,y] ++ xs
..... and so on ......
这是因为:
与右边相关,所以(x:y:xs)
实际上是(x:(y:xs))
。
最后,_
是一个通配符。它就像x
或y
或xs
这样的可变模式,但没有名字。每个_
都与另一个不同,就好像它以一个独特的,虽然缺少的名字命名。