【问题标题】:Haskell List Comprehension: Boolean Item in List used as predicateHaskell List Comprehension:List 中用作谓词的布尔项
【发布时间】: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 &lt;- [False,True,True] , True] 将返回 [False,True,True]

一般来说,

[b | b &lt;- [x,y,z] , True] 将返回 [x,y,z]

然而,

[b | b &lt;- [False,True,True] , b] 将返回 [True,True]

一般来说,

[b | b &lt;- [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 &lt;- [x,y,z],True] 的长度始终为3

为什么使用b 作为谓词起作用?

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

【问题讨论】:

    标签: haskell list-comprehension


    【解决方案1】:

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

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

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

    这里我们创建一个列表[x, y, z],我们将枚举它,b 作为枚举器。因此,它看起来有点像 Python 中的 for 循环。

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

    因此,我们构造了一个Trues 的列表:列表中的所有项目都是True,但我们对列表中的项目并不感兴趣。我们对列表理解产生的 number 个项目感兴趣。因此,我们使用length :: [a] -&gt; Int 来确定@​​987654338@、yzTrue 的次数。这意味着:

    length [b | b <- [x, y, z], b]  -- number of True's in [x, y, z]
    

    如果这个数字大于或等于二,那么我们因此知道至少有两个Trues。

    【讨论】:

    • length [b | b &lt;- [x, y, z], b==True]会不会有同样的意思?
    • @overworkedstudent:是的,但是x == True 有点荒谬,因为它等同于x,因此只会更长。
    • @overworkedstudent 当n 是一个整数但我们需要一个布尔值时,我们经常求助于n == 42 之类的比较。然而,当b 是一个布尔值并且我们需要一个布尔值时,没有必要使用像== 这样的比较:我们已经有了我们需要的值:b(或者,最多,not b if我们需要否定它)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多