scala - 当函数值本身不是函数值时,为什么可以在预期函数值的地方使用 scala 函数名称?
问题描述
def f(x: Int): Boolean = (x >= 0 && x < 4)
List(1, 3, 5).map(f) // List(true, true, false)
f // does not compile
为什么可以f
在期望函数值的地方使用,即使它本身不是函数值?
解决方案
怎么了?
在需要函数类型的地方,f
转换为匿名函数(x: Int) => f(x)
。
def f(x: Int): Boolean = (x >= 0 && x < 4)
// f // f itself is not a function value
f(_) // f(_) is an anonymous function
List(1, 3, 5).map(f) // f is converted to f(_) in places where a function type is expected
List(1, 3, 5).map(f(_)) // equivalent to last line
为什么首先f
不是函数值?
f
因为没有定义无参数函数。咖喱(无参数)函数值将起作用:
val g = (x: Int) => (x >= 0 && x < 4)
g
为什么被f
接受为函数值?
map
需要一个函数类型,并且因为curried 和 uncurried 版本f
f
和g
两者都做同样的事情,所以自动转换是有意义的。- 另一个优点是
map(f)
外观比map(f(_))
. - 为您完成的所有自动和语法糖的缺点是它可能会令人困惑
推荐阅读
- javascript - 基于名称的复选框选择正在提示其他复选框选项
- linux - 无法将 C++ 扩展上传到 Colab
- laravel - 如何根据key获取数据数组?
- unity3d - 有没有更好的方法来写这个自上而下的汽车 mdoel
- ruby - 在Ruby中将字符串解析为时间(Time.parse)时如何忽略DST
- javascript - Javascript - 使用 javascript 将标签与输入相关联
- ios - 为 indexPath 获取 didSelectItemAt 上的值并将其添加到委托/协议以填充标题单元格
- javascript - Wordpress 无法从 ajax 请求中获取_current_user_id()
- django - 无效的块标签:“edit_url”,预期为“空”或“endfor”。您是否忘记注册或加载此标签?
- sql - 在 SQL 中的模式上删除表的权限