1

对于初学者Haskell课程的家庭作业的一部分,我正在尝试编写一个程序,该程序将获取一对布尔值列表,并返回来自布尔值对的布尔值列表,它们之间有一个“&&”。例如...

andandbool [(True,True),(True,False),(False,True),(False,False)] 

会返回:

[True, False, False, False]

然而,我总是遇到麻烦。我的代码看起来像这样。

andandbool :: [(Bool,Bool)] -> [Bool]
andandbool [a] = [fst x && snd x | x <- [a]]

当我只提供一对列表时它工作正常,但当我输入多对列表时报告“函数和布尔的非详尽模式”。我是否缺少某种列表理解?任何指向正确方向的指针将不胜感激。

4

1 回答 1

5

现在我在我的电脑前,我会把我的评论变成一个答案。

当您命名函数的参数时[a],Haskell 将其解释为您的函数模式匹配一​​个元素的列表。这就是为什么您的函数仅适用于单元素列表的原因。要修复它,只需将函数参数重命名为名称中不带括号的名称:

andandbool :: [(Bool,Bool)] -> [Bool]
andandbool as = [fst x && snd x | x <- as]

as参数现在将匹配任何列表。

编辑:就像@Ankur 提到的那样,您可以将其简化为:

andandbool as = [x && y | (x, y) <- as]

如果您真的想打代码高尔夫,您可以将其简化为:

andandbool = map (uncurry (&&))
于 2013-09-19T03:49:41.170 回答