【发布时间】:2023-04-01 21:12:01
【问题描述】:
我正在写一个函数majority。
如果至少有两个参数是True,则函数返回True。
如果至少有两个参数是False,则函数返回False。
函数可以这样写:
majority :: (Bool,Bool,Bool) -> Bool
majority (True,True,_)=True
majority (True,_,True) = True
majority (_,True,True)=True
majority _ = False
或者,可以使用列表推导:
majority' (x,y,z) = length [b | b <- [x,y,z] , b] >= 2
我不完全理解为什么第二个解决方案有效。
我知道这意味着我们将采用b,使其成为[x,y,z] 和b 之一,应用于b 必须是True。此列表的长度必须大于或等于2。
谓词中的b(第三个b)是否会更改其值,因为它等于x,然后是y,然后是z。或者,b 是否始终具有 x 的值?
我试过了:
majority'' (x,y,z) = length [b | b <- [x,y,z] , True] >= 2
我发现这总是返回True,即使函数应该返回False。
另外,我注意到了
[b | b <- [False,True,True] , True] 将返回 [False,True,True]
一般来说,
[b | b <- [x,y,z] , True] 将返回 [x,y,z]
然而,
[b | b <- [False,True,True] , b] 将返回 [True,True]
一般来说,
[b | b <- [x,y,z] , b] 将返回一个Trues 列表,该列表与[x,y,z] 中Trues 的数量一样长
这解释了原因
majority'' (x,y,z) = length [b | b <- [x,y,z] , True] >= 2
总是返回True。不等式始终为True,因为列表[b | b <- [x,y,z],True] 的长度始终为3。
为什么使用b 作为谓词起作用?
majority' (x,y,z) = length [b | b <- [x,y,z] , b] >= 2
【问题讨论】:
标签: haskell list-comprehension