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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么这个lambda函数是模式匹配和cons运算符的解析错误?相关的知识,希望对你有一定的参考价值。

我试图从列表列表中解析记录(从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))

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

以上是关于为什么这个lambda函数是模式匹配和cons运算符的解析错误?的主要内容,如果未能解决你的问题,请参考以下文章

Python 函数进阶-lambda匿名函数和三元运算符

如何匹配 aws cloudwatch 日志中的多个模式以触发 lambda

继承函数的重载解决方案

三元运算符不适用于 lambda 函数

为啥 lambda auto& 参数选择 const 重载?

Day03---集合,函数,三目运算,lambda表达式,内置函数,文件操作