Home Articles

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

Asked
Viewed 597 times
1

对于初学Haskell课程中的家庭作业的一部分,我正在尝试编写一个程序,该程序将获取Bools对的列表,并返回来自bool对的Bool列表,其间有“&&” . 例如...

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 Answer

  • 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 (&&))
    

Related