有人可以告诉我代码中函数序列的两种实现之间的区别吗?
我正在将IntelIJ IDEA与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]]
}
我希望最后一行能达到同样的效果,相反,它表明我返回了一个Option [List [Nothing]]。
答案 0 :(得分:2)
TL; DR,f(_)
不等于f(x => x)
正如在相关SO answer中雄辩地解释的那样,您正在研究anonymous function
与partially applied function
的“简写形式”之间的区别。
当_
是表示参数的表达式的一部分时:
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)