首页 > 解决方案 > Scala高阶函数:下划线(_)的问题

问题描述

有人可以告诉我代码中函数序列的两种实现之间的区别吗?

我正在使用带有 sbt 的 IntelIJ IDEA。

  def traverse[A, B](a : List[A]) (f : A => Option[B]) : Option[List[B]] = {
    a.foldRight(Some(List[B]()) : Option[List[B]])(
      (x, y) => for {
        xx <- f(x)
        yy <- y
      } yield xx +: yy
    )
  }
  def sequence[A](a: List[Option[A]]): Option[List[A]] = {
    traverse(a)(x => x) //worked
    //traverse(a)(_) //Expression of type (Option[A] => Option[B_]) => Option[List[Nothing]] doesn't conform to expected type Option[List[A]]
  }

我希望最后一行能达到同样的效果,而是显示我返回了一个 Option[List[Nothing]]。

标签: scala

解决方案


TL;DR,f(_)不等于f(x => x)

正如此相关SO 答案中雄辩地解释的那样,您正在查看anonymous functionvs的“简短形式”之间的区别partially applied function

When_是表示参数的表达式的一部分:

f(_ + 1)  // f(x => x + 1)
g(2 * _)  // g(x => 2 * x)

When_本身是一个参数:

f(_)      // x => f(x)
g(1, _)   // x => g(1, x)
h(0)(_)   // x => h(0)(x)

推荐阅读