微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Haskell 列表理解:列表中的布尔项用作谓词

如何解决Haskell 列表理解:列表中的布尔项用作谓词

我正在编写一个函数 majority

如果至少有两个参数是 True,则函数返回 True

如果至少有两个参数是 False,则函数返回 False

函数可以这样写:

majority :: (Bool,Bool,Bool) -> Bool
majority (True,True,_)=True
majority (True,_,True) = True
majority (_,True)=True
majority _ = False

或者,可以使用列表推导式:

majority' (x,y,z) = length [b | b <- [x,z],b] >= 2

我不完全理解为什么第二种解决方案有效。

我知道这意味着我们将采用 b 使其成为 [x,z] 之一,并且应用于 bb 必须为 True。此列表的长度必须大于或等于 2

谓词中的b(第三个b)是否改变其值,因为它等于x,然后是y,然后是z .或者,b 是否总是具有 x 的值?

我试过了:

majority'' (x,True] >= 2

我发现这总是返回 True,即使函数应该返回 False

另外,我注意到了

[b | b <- [False,True],True] 将返回 [False,True]

总的来说,

[b | b <- [x,True] 将返回 [x,z]

然而,

[b | b <- [False,b] 将返回 [True,b] 将返回一个 True 的列表,其长度与 True

中的 [x,z]数量一样长

这就解释了原因

majority'' (x,True] >= 2

总是返回 True。不等式总是 True,因为列表 [b | b <- [x,True] 的长度总是 3

为什么使用 b 作为谓词有效?

majority' (x,b] >= 2

解决方法

我不完全理解为什么第二种解决方案有效。

让我们首先关注列表理解:

[b | b <- [x,y,z],b]

这里我们创建一个列表 [x,z],我们将对其进行枚举,以 b 作为枚举器。因此,它看起来在某种程度上类似于 Python 中的 for 循环。

下一部分,列表推导式右侧的 b 是一个过滤器。这意味着它只会在 bTrue 时产生结果。这意味着如果 [x,z]False,False,True,那么列表推导将产生一个 True,因为过滤器 b 将拒绝前两项,因为 {{1 }} 是 b

因此我们构造了一个 False 的列表:列表中的所有项目都将是 True,但我们对列表中的项目不那么感兴趣。我们对列表推导式生成的 数量 项感兴趣。因此,我们利用 length :: [a] -> Int 来确定 Truexyz 的次数。这意味着:

True

如果该数字大于或等于 2,那么我们就知道至少有两个 length [b | b <- [x,b] -- number of True's in [x,z]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?