对于初学者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中的非详尽模式”。我缺少某种列表理解吗?任何指向正确方向的人都会非常感激。
答案 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 (&&))