【问题标题】:How can I fix this program dealing with pairs of Booleans in Haskell?如何修复这个在 Haskell 中处理布尔值对的程序?
【发布时间】:2013-09-19 01:19:00
【问题描述】:

对于初学者 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]]

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

【问题讨论】:

  • 考虑 [a] 是一个只有一个元素的列表(在你的情况下是一对)。另一方面,任何任意变量,例如a,都可以是任意数量元素的列表...
  • 将代码中的[a] 替换为as。括号是只包含一个元素的列表的保留语法。
  • 非常感谢你们,我从来不知道!很有帮助!

标签: haskell


【解决方案1】:

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

当您将函数的参数命名为 [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 (&&))

【讨论】:

  • 一点模式匹配..[x &amp;&amp; y | (x,y) &lt;- as]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
相关资源
最近更新 更多