如何解决Haskell 列表理解:列表中的布尔项用作谓词
如果至少有两个参数是 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]
之一,并且应用于 b
的 b
必须为 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
是一个过滤器。这意味着它只会在 b
为 True
时产生结果。这意味着如果 [x,z]
是 False,False,True
,那么列表推导将产生一个 True
,因为过滤器 b
将拒绝前两项,因为 {{1 }} 是 b
。
因此我们构造了一个 False
的列表:列表中的所有项目都将是 True
,但我们对列表中的项目不那么感兴趣。我们对列表推导式生成的 数量 项感兴趣。因此,我们利用 length :: [a] -> Int
来确定 True
、x
和 y
为 z
的次数。这意味着:
True
如果该数字大于或等于 2,那么我们就知道至少有两个 length [b | b <- [x,b] -- number of True's in [x,z]
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。