scala curried功能与产量

时间:2014-10-01 19:49:43

标签: scala yield

我尝试学习Scala中的curried函数, 看到代码

  def isEven(v: Int): Boolean = v % 2 == 0

  def evens(numbers: List[Int])(even: Int => Unit) {
    for (number <- numbers; if isEven(number)) {
      even(number)
    }
  }

  val my = List.range(1, 100)

  evens(my){println(_)} // works fine and prints the even numbers as expected 

  val recurse = evens(my) { yield _ } //compilation error

我希望得到结果作为产量积累,但我不能在Scala文档或任何示例中对如何执行此操作进行罚款。 任何的想法?

2 个答案:

答案 0 :(得分:4)

您无法抽象出for两种形式的用法。一个人去了foreach,另一个去了map和(可能)flatMap;返回类型也不同。

您可以编写两个函数,或者可以编写泛型方法并忽略返回值:

def evens[A](numbers: List[Int])(even: Int => A): List[A] = {
  for (number <- numbers if (number % 2) == 0) yield even(number)
}

现在,如果您希望列表保持不变,请使用identity函数:

val e = evens(my)(identity)
val e = evens(my)(x => x)   // Equivalent

如果您想对其执行某些操作,则忽略返回值:

evens(my)(println)

答案 1 :(得分:0)

Scala curried函数没有实际用于产量,正如我在我的问题中尝试的那样, 为此目的,根本不需要使用curried函数,因为你只需要以下内容:

  def evens(numbers: List[Int]) : List[Int] = {
     for (number <- numbers if (number % 2) == 0) yield number
  }

然后:

    val my = List.range(1, 100)
    evens(my).foreach(f => println(f))

感谢@RexKerr提供的解决方案,展示了如何利用泛型和curried函数来产生并返回咖喱结果。