Scala では、PartialFunction[A, B]
クラスは型から派生しFunction[A, B]
ます (Scala リファレンス、12.3.3 を参照)。ただし、これは直感に反するように思えます。なぜなら、 a Function
(すべてに対して定義する必要があるA
) は、場所によっては定義されていない可能性がある a よりも厳しい要件があるPartialFunction
からです。
私が遭遇した問題は、部分関数がある場合、 a を使用しFunction
て部分関数を拡張できないことです。例えば。できない:
(pf orElse (_)=>"default")(x)
(構文が少なくともリモートで正しいことを願っています)
このサブタイピングが逆に行われるのはなぜですか? Function
型が組み込まれているなど、見落としている理由はありますか?
ところで、もしFunction1 :> Function0
そうなら、上記の例で仮引数を必要としないのもいいでしょう:-)
サブタイプの問題を明確にするために編集
2 つのアプローチの違いは、2 つの例を見て強調することができます。どちらが正しいですか?
1:
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?