En Scala, l' PartialFunction[A, B]
classe est dérivée de type Function[A, B]
(voir Scala de Référence, 12.3.3). Toutefois, cela semble contre-intuitif pour moi, depuis un Function
(qui doit être définie pour tous les A
) a des exigences plus strictes que d'un PartialFunction
, qui peut être indéfini à certains endroits.
Le problème que j'ai trouvé était que lorsque j'ai un partiel de la fonction, je ne peux pas utiliser un Function
d'étendre la fonction partielle. Par exemple. Je ne peut pas faire:
(pf orElse (_)=>"default")(x)
(Espérons que la syntaxe est au moins à distance de la droite)
Pourquoi est-ce sous-typage fait l'inverse? Existe-il des raisons que j'ai oubliées, comme le fait que l' Function
types sont intégrés?
BTW, il serait aussi bien si Function1 :> Function0
donc je n'ai pas l'argument factice dans l'exemple ci-dessus :-)
Edit pour préciser le problème de sous-typage
La différence entre les deux approches peut être mis en évidence en examinant les deux exemples. Lequel d'entre eux est le droit?
Un:
val zeroOne : PartialFunction[Float, Float] = { case 0 => 1 }
val sinc = zeroOne orElse ((x) => sin(x)/x) // should this be a breach of promise?
Deux:
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?