【问题标题】:Applying logical and to list of boolean values将逻辑和应用于布尔值列表
【发布时间】:2014-03-19 21:44:54
【问题描述】:

考虑以下 Scala 中的布尔值列表

List(true, false, false, true)

您将如何使用 foldRight 或 foldLeft 来模拟对列表中的所有值执行逻辑与的功能?

【问题讨论】:

标签: scala boolean logical-operators fold


【解决方案1】:

除了使用foldLeft/Right,您还可以使用forall(identity) 作为逻辑与,或使用exists(identity) 作为逻辑或。

edit:这些功能的好处是提前退出。如果forall 命中falseexiststrue,它们将立即返回。

【讨论】:

  • 小心退化的情况。这可能是违反直觉的。基本上,以下两个表达式都是trueList.empty[Boolean].forall(identity) == trueList.empty[Boolean].exists(identity) == false
  • 是的,但是使用&&|| 折叠会得到相同的结果。
  • 这些行为完全合乎逻辑。给定一个谓词 p 和一组空值 S = {},当然“p(x) for all in x in S”是真的,同样“S 中存在 x 使得 p(x)”是false,无论 p 的定义如何。
【解决方案2】:
val l = List(true, false, false, true)
val andAll = l.foldLeft(true)(_ && _)

【讨论】:

  • reduceOption 有助于处理退化情况(见下面的答案)
【解决方案3】:

没有foldLeft中的初始值,

List(true, false, false, true).reduce(_&&_)

但这不适用于List.empty[Boolean]

【讨论】:

    【解决方案4】:

    我最喜欢forAll 方法,只要它适合您的用例。它提前退出,这很棒。但是,如果这不适合这里的另一种方法,只是稍微复杂一点。

    使用 reduceOption 你不会提前退出,但你可以清楚地为列表为空的情况指定值。

    val l = List(true, false, false, true)
    val andAll = l.reduceOption(_ && _).getOrElse(false)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多