【问题标题】:Using reduceLeft in place of foldLeft in scala在scala中使用reduceLeft代替foldLeft
【发布时间】:2016-04-29 02:55:15
【问题描述】:

我想确定是否可以通过使用 reduceLeft 而不是 foldLeft 来实现这一点。我正在列表中搜索给定的数字

val included = List(46, 19, 92).foldLeft(false) { (a, i) =>
| if (a) a else (i == 19)
| }
included: Boolean = true

但是我想使用 reduceLeft 来完成同样的任务,这可能吗?

【问题讨论】:

    标签: scala functional-programming fold


    【解决方案1】:

    正确的做法是

    val included = List(46, 19, 92).contains(19)
    

    但如果你坚持使用reduceLeft,那么你可以这样写:

    val included = List(46, 19, 92).reduceLeft { (a, b) =>
      if (b == 19) b else a
    } == 19
    

    【讨论】:

      【解决方案2】:

      不直接。通常情况下,类型就是答案。

      reduceLeft 有一种类似的类型:

      List[A] => ((A,A) => A) => A
      

      给定一个 A 的列表,以及一个可以将 2 个 A 值组合成 1 个 A 值的函数,你会得到一个 A 值。

      你可以做的事情是这样的:

      val a = List(46, 19, 92).reduceLeft { (a, b) =>
       if(b == 19) b else a
      }
      
      val included = a == 19
      

      当然,为此使用“包含”比使用其中任何一个选项更好。

      【讨论】:

      • contains,不是existslist contains 19 vs list exists (_ == 19)
      • 正确且已修复,这就是我在移动设备上写答案时得到的结果:)。
      【解决方案3】:

      你不能以简单的方式做到这一点。使用 foldLeft 您可以定义结果类型:它是累加器的类型,因此 i 是您作为第一个参数提供的零元素的类型。
      ReduceLeft 使用集合的第一个元素作为累加器的零元素。因此结果类型将与列表中的元素相同,在您的情况下为 Int。

      【讨论】:

        猜你喜欢
        • 2011-12-07
        • 2013-06-12
        • 1970-01-01
        • 2018-06-27
        • 1970-01-01
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        相关资源
        最近更新 更多