PartialFunction和Function1之间的关系是什么

时间:2017-09-04 02:23:39

标签: scala

我正在学习Scala,并从scala doc中找到 PartialFunction Function1 的定义,如下所示:

trait PartialFunction[-A, +B] extends (A) ⇒ B
trait Function1[-T1, +R] extends AnyRef

Q1)我的第一个问题是:(A)=>的类型是什么?乙

而且,我知道我们可以通过 lift 方法将 PartialFunction 变为普通函数。

但是Q2) ParitialFunction Function1 之间的关系是什么?

似乎某个函数参数的类型为 Function1 ,我们可以将匹配的 PartitionFunction 传递给它,如下所示:

scala> val process = (f: Function1[String, Int]) => f("1024")
process: (String => Int) => Int = <function1>

scala> val pattern = "([0-9]+)".r
pattern: scala.util.matching.Regex = ([0-9]+)

scala> val str2int: PartialFunction[String, Int] = {
     | case pattern(num) => num.toInt
     | }
str2int: PartialFunction[String,Int] = <function1>

scala> accept(str2int)
res67: Int = 1024

谢谢!

1 个答案:

答案 0 :(得分:2)

A ⇒ BFunction1[A, B]的语法糖。同样,(A1, A2) ⇒ R实际上是Function2[A1, A2, R]等等,一直到22(完全任意限制)。因此PartialFunction的定义是

trait PartialFunction[-A, +B] extends Function1[A, B]

由于PartialFunction[A, B]也是Function1[A, B],您可以将其传递给需要A ⇒ B的内容。我们使用超过FunctionN的唯一原因是审美:它看起来更好。实际上,由于不是真正的类型名称,我们不能说出类似的内容:

type ApIntInt[T[_, _]] = T[Int, Int]
// ApIntInt[⇒] // Error: ⇒ is not a type and was not expected here
ApIntInt[Function1] // Fine: Function1 is a type, it has the right kind, so it works.
// ApIntInt[Function1] = Function1[Int, Int] = Int ⇒ Int

既然你是初学者,很长一段时间你都不会看到这种东西(更高级别的东西),但它 那里,你很可能会受到影响总有一天。

当您使用PartialFunction作为Function1时,如果传递未定义的值,则(可能)会抛出异常,通常为MatchError(但并非必须如此)。相比之下,如果您致电pf.lift,则会创建Function[In, Option[Out]],如果在某个点定义了Some(result),则返回PartialFunction,如果是None则返回lazy val factorial: PartialFunction[Int, Int] = { case num if num > 1 => num * factorial(num - 1) case 1 => 1 } assert(!factorial.isDefinedAt(0)) factorial.apply(0) // Using a PF as a Function1 on an undefined point breaks (here with MatchError) factorial.lift.apply(0) // This just returns None, because it checks isDefinedAt first 根据Scaladoc,不是。

例如:

margin-bottom