В Scala класс PartialFunction[A, B]
является производным от типа Function[A, B]
(см. Справочник Scala, 12.3.3). Однако это кажется мне нелогичным, поскольку Function
(который должен быть определен для всех A
) имеет более строгие требования, чем PartialFunction
, который в некоторых местах может быть неопределенным.
Проблема, с которой я столкнулся, заключалась в том, что когда у меня есть частичная функция, я не могу использовать Function
для расширения частичной функции. Например. Я не могу сделать:
(pf orElse (_)=>"default")(x)
(надеюсь, синтаксис хотя бы удаленно верен)
Почему этот подтип выполняется наоборот? Есть ли какие-то причины, которые я упустил из виду, например, тот факт, что типы Function
являются встроенными?
Кстати, было бы также неплохо, если бы Function1 :> Function0
, поэтому мне не нужно иметь фиктивный аргумент в приведенном выше примере: -)
Изменить, чтобы прояснить проблему с подтипами
Различие между этими двумя подходами можно подчеркнуть, рассмотрев два примера. Кто из них прав?
One:
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?