scala - 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]]。
解决方案
TL;DR,f(_)
不等于f(x => x)
正如此相关SO 答案中雄辩地解释的那样,您正在查看anonymous function
vs的“简短形式”之间的区别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)
推荐阅读
- r - 在 R 中使用多元回归时如何仅返回单个预测值
- dns - 如何在 cpanel 中添加新域
- .net - 如何在 C# 中将 IntPtr 转换为字节数组?
- python - 在 Python 中从字符串中提取子字符串的优雅方法
- javascript - 将函数导出到钩子中
- node.js - 如何使用 Nodemailer 和 Firebase 异步向多个用户发送邮件
- java - 无法从 ViewModel 中的方法访问 livedata 的值
- python - 如何将按钮放在内部网格上?
- php - 如何在商店页面的产品标题下方添加自定义 Woocommerce 副标题?
- r - 我想在 R 中使用函数“sam”来比较两个光谱并检测差异,但我收到一条错误消息