【发布时间】:2020-08-23 08:19:48
【问题描述】:
我正在阅读有关 scala 匿名函数 here 的信息,发现它们可以采用以下格式:
{ case p1 => b1 … case pn => bn }
但是,我认为这就是部分函数的编写方式。事实上,在this blog post 中,作者将部分函数称为匿名函数。起初他说collect 采用部分函数,但后来似乎称它为匿名函数(“collect 可以处理您的匿名函数......”)。
难道只是一些匿名函数是偏函数吗?如果是这样,所有部分函数都是匿名的吗?或者他们只是匿名,如果格式像 Alvin Alexander 在这里的例子:
val divide2: PartialFunction[Int, Int] = {
case d: Int if d != 0 => 42 / d
}
【问题讨论】:
-
好的,所以你混淆了很多东西。首先,Scala 中的 function 是什么。我们可以将其定义为只是一个计算,它类似于一个方法,但主要区别(还有很多其他)是函数是值(意味着它们是某个类的实例,因此它们是对象) 而方法不是。 - 函数字面量是语言提供的一种特殊语法,用于创建函数类的实例。 - 匿名函数只是一个没有名字的函数,所以
map(x => x + 1)是一个匿名函数,而val f = (x: Int) => x + 1不是。 -
现在偏函数只是一个没有与所有输入关联的值的函数。而
PartialFunction类扩展了Function1类,所以所有偏函数都是函数。最后,是的,该语言为创建部分函数提供了特殊的语法(类似于模式匹配),但是当编译器需要一个完整的函数时,也可以使用相同的语法,并且编译器会检查匹配的完整性。 -
@RyanQuey 在 scala 库中的某处定义了从部分函数到常规函数的隐式转换。这就是为什么您可以将
cb : PartialFunction[Try[_], Unit]传递给onComplete和getPosts。但是,如果您尝试使用此常规函数支持的部分函数无法处理的参数运行常规函数,它将引发异常。 -
@RyanQuey 不会发生
cb,因为它只是类型定义的部分函数,但实际上它是常规函数,因为它可以处理所有参数。 -
@BogdanVakulenko 不是隐式转换,只是基本的子类型。 PartialFunction 扩展了 Function.
标签: scala anonymous-function partialfunction