Esiste un modo rapido per utilizzare come funzione concreta (di tipo, ad esempio, (A) => B
) come PartialFunction[A, B]
? La sintassi più concisa che conosco è:Scala PartialFunctions from concrete
(a: A) => a match { case obj => func(obj) }
Esiste una conversione implicita da nessuna parte, qualcosa di simile:
implicit def funcAsPartial[A, B](func: A => B) = new PartialFunction[A, B] {
def isDefinedAt(a: A) = true
def apply(a: A) = func(a)
}
Credo che ho appena scritto quello che stavo cercando, ma fa questo già esiste in le librerie Scala?
Grazie; Avevo l'idea sbagliata che Function1 implicava essere definita sull'intero dominio. –
@AaronNovstrup: la spiegazione del contratto di PartialFunction è l'unica che abbia senso, ma non viene riflessa da ScalaDocs (almeno fino al 2.9.1). I programmi Scala di 'PartialFunction' affermano che:" Una funzione parziale di tipo 'PartialFunction [A, B]' è una funzione unaria in cui il dominio non include necessariamente tutti i valori di tipo 'A'." Inoltre, non affermano mai che è sicuro (in che senso) chiamare f ovunque definito, ed è piuttosto facile da violare, come fatto dal letterale '{case 0 => 1/0}' PartialFunction'. Dove hai preso quelle informazioni? È necessario presentare una segnalazione di bug? – Blaisorblade
@Blaisorblade Credo di aver letto questa spiegazione sulla mailing list mentre stavo imparando Scala (è passato un po 'di tempo), e non stavo guardando alcuna documentazione quando ho scritto questa risposta. E, sì, è facile e anche un po 'comune violare questo contratto (ad esempio, per avvolgere/rilanciare un'eccezione in un blocco catch). Il punto reale è che le funzioni parziali definiscono il loro dominio mentre le funzioni ordinarie non lo fanno (con un po 'di confusione su ciò che in realtà significa). –