gpt4 book ai didi

parsing - 为什么这个 lambda 函数会出现模式匹配和 cons 运算符的解析错误?

转载 作者:行者123 更新时间:2023-12-02 10:42:02 24 4
gpt4 key购买 nike

我正在尝试从列表列表中解析记录(从 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 ‘:’

我发誓我以前见过 lambda 中使用的这种模式匹配。我错过了什么,我的冒号运算符是解析错误?很难询问出了什么问题。

谢谢!

最佳答案

就像函数绑定(bind)中的模式需要括号一样,

f <b>(</b>x:xs<b>)</b> = ...

您需要用括号将 lambda 表达式括起来:

parseRecords = map (\ <b>(</b>f1:f2:f3:f4:f5:f6:f7:f8:f9:_<b>)</b> -> Record f1 f2 f3 f4 f5 f6 f7 f8 f9)
-------pattern----------------
------------------lambda function--------------------------------------

有时可以省略括号,但并非总是如此。列表模式是:

<b>[]</b>           matches     []
<b>(</b>x:xs<b>)</b> matches [x, ...] so that (x:xs) == [x] ++ xs
<b>(</b>x:y:xs<b>)</b> matches [x, y, ...] so that (x:y:xs) == [x] ++ (y:xs)
== [x,y] ++ xs
..... and so on ......

这是因为 : 关联到右侧,因此 (x:y:xs) 实际上是 (x:(y:xs)).

最后,_ 是一个通配符。它就像一个变量模式,如 xyxs,但没有名称。每个 _ 都彼此不同,就好像它是用一个唯一但缺失的名称命名的。

关于parsing - 为什么这个 lambda 函数会出现模式匹配和 cons 运算符的解析错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55669976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com