我正在学习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
谢谢!
答案 0 :(得分:2)
A ⇒ B
是Function1[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