在Scala中,PartialFunction[A, B]
类是从类型Function[A, B]
派生而来(参见Scala参考手册12.3.3)。然而,这似乎与我的直觉相反,因为一个Function
(需要对所有的A
进行定义)具有比PartialFunction
更严格的要求,而PartialFunction
可以在某些地方未定义。
我遇到的问题是当我有一个部分函数时,我不能使用Function
来扩展这个部分函数。例如,我不能这样做:
(pf orElse (_)=>"default")(x)
(希望语法至少大体正确)
为什么要反向进行子类型化?我是否忽略了一些原因,例如 Function
类型是内置的事实?
顺便说一句,如果 Function1:> Function0
,那么在上面的示例中我就不需要虚拟参数了 :-)
编辑以澄清子类型化问题
通过查看两个示例可以强调两种方法之间的区别。 哪一个是正确的?
第一个:
val zeroOne : PartialFunction[Float, Float] = { case 0 => 1 }
val sinc = zeroOne orElse ((x) => sin(x)/x) // should this be a breach of promise?
二:
def foo(f : (Int)=>Int) {
print(f(1))
}
val bar = new PartialFunction[Int, Int] {
def apply(x : Int) = x/2
def isDefinedAt(x : Int) = x%2 == 0
}
foo(bar) // should this be a breach of promise?