我如何修复这个程序来处理Haskell中的布尔对?

时间:2013-09-19 01:19:01

标签: haskell

对于初学者Haskell课程中的家庭作业任务的一部分,我正在尝试编写一个程序,该程序将采用Bools对的列表,并返回来自bool对的Bool列表,其中包含“& amp; &安培;”它们之间。例如......

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

当我提供仅一对的列表时,它工作正常,但当我输入多对列表时,报告“函数andandbool中的非详尽模式”。我缺少某种列表理解吗?任何指向正确方向的人都会非常感激。

1 个答案:

答案 0 :(得分: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 (&&))