Scala高阶函数:下划线(\ux)有问题

Scala高阶函数:下划线(\ux)有问题,scala,Scala,有人能告诉我代码中函数序列的两种实现之间的区别吗 我将IntelIJ理念与sbt结合使用 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 }

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

我将IntelIJ理念与sbt结合使用

  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]]
  }
def遍历[A,B](A:List[A])(f:A=>Option[B]):Option[List[B]={
a、 foldRight(一些(列表[B]()):选项[List[B])(
(x,y)=>对于{
xx选项[B_417;]=>选项[List[Nothing]]与预期类型选项[List[A]]不符
}
我希望最后一行也能达到同样的效果,相反,它显示我返回了一个选项[List[Nothing].

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

正如这篇相关文章中雄辩地解释的,您看到的是
匿名函数
的“缩写形式”与
部分应用函数
之间的区别

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

f(_ + 1)  // f(x => x + 1)
g(2 * _)  // g(x => 2 * x)
本身是一个参数时:

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

您选择的答案有误导性或错误。没有区别。如果有人解释说
在包含它的表达式中展开会更好。纯
并不意味着
标识
。请尝试纯
在REPL中,您不会看到“缺少的参数类型”,而是“未绑定的占位符”@som snytt,尽管这两个用例都作为
占位符语法的示例包含在中,但我们仍然看到它们所代表的东西非常不同(如我的示例所示)我甚至认为,不指出两者之间的差异会导致不必要的混淆,我认为参考答案中描述的差异(可能更多地被视为一种技术类比,而不是一种正式的断言)有助于澄清很多事情。你可能是对的。在gitter上,我说可能有教学价值。我认为人们被下划线弄糊涂了,因为他们看到太多的“特殊情况”,所以减少IMHO是一种胜利。IMHO对语法的描述有一些错误,将“封闭括号”作为规则或助记符。