为什么这个lambda函数是模式匹配和cons运算符的解析错误?

问题描述 投票:3回答:1

我试图从列表列表中解析记录(从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的模式匹配。我错过了我的冒号运算符是一个解析错误?很难质疑出了什么问题。

谢谢!

parsing haskell
1个回答
3
投票

就像在函数绑定中需要关于模式的括号一样,

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))

最后,_是一个通配符。它就像xyxs这样的可变模式,但没有名字。每个_都与另一个不同,就好像它以一个独特的,虽然缺少的名字命名。

© www.soinside.com 2019 - 2024. All rights reserved.