¿Hay alguna forma rápida de usar como una función concreta (de tipo, por ejemplo, (A) => B
) como PartialFunction[A, B]
? La sintaxis más concisa que conozco es:Scala PartialFunctions from concrete
(a: A) => a match { case obj => func(obj) }
¿Hay una conversión implícita en cualquier lugar, algo así como:
implicit def funcAsPartial[A, B](func: A => B) = new PartialFunction[A, B] {
def isDefinedAt(a: A) = true
def apply(a: A) = func(a)
}
supongo que acabo de escribir lo que estaba buscando, pero esto ya existe en las bibliotecas de Scala?
Gracias; Tuve la idea errónea de que Function1 implicaba estar definido en todo el dominio. –
@AaronNovstrup: su explicación del contrato de PartialFunction es la única que tiene sentido, pero ScalaDocs no lo refleja (al menos hasta 2.9.1). Los ScalaDocs de 'PartialFunction' afirman que:" Una función parcial de tipo 'PartialFunction [A, B]' es una función unaria donde el dominio no incluye necesariamente todos los valores de tipo 'A'. " Además, nunca afirman que sea seguro (en qué sentido) llamar a f donde sea que se haya definido, y eso es bastante fácil de violar, como lo hace el literal 'PartialFunction' literal' {case 0 => 1/0} '. ¿De dónde sacaste esa información? ¿Se debe presentar un informe de error? – Blaisorblade
@Blaisorblade Creo que leí esta explicación en la lista de correo cuando estaba aprendiendo Scala (ha pasado un tiempo), y no estaba mirando ninguna documentación cuando escribí esta respuesta. Y, sí, es fácil e incluso algo común violar este contrato (por ejemplo, para envolver/volver a lanzar una excepción en un bloque catch). El verdadero punto es que las funciones parciales definen su dominio, mientras que las funciones comunes no lo hacen (con cierta falta de claridad sobre lo que realmente significa). –