Je viens de temps en temps à travers le schéma suivant, où j'ai essentiellement un PartialFunction[SomeType,AnotherType]
, et que vous voulez le traiter comme un Function[SomeType,Option[AnotherType]
, par exemple:Existe-t-il une meilleure façon de lever une fonction partielle dans Scala?
def f(s:SomeType):Option[AnotherType] = s match {
case s1:SubType1 => Some(AnotherType(s1.whatever))
case s2:SubType2 => Some(AnotherType(s2.whatever))
case _ => None
}
Est-il possible d'écrire la fonction ci-dessus d'une manière qui évite la cas par défaut et envelopper le résultat dans Some
où il est défini? Le meilleur que j'ai trouvé jusqu'ici est le suivant:
def f(s:SomeType):Option[AnotherType] = pf.lift(s)
def pf:PartialFunction[SomeType,AnotherType] = {
case s1:SubType1 => AnotherType(s1.whatever)
case s2:SubType2 => AnotherType(s2.whatever)
}
Y a-t-il un moyen de le faire sans définir une fonction intermédiaire? Je l'ai déjà essayé différentes choses le long des lignes de ce qui suit, mais n'ai rien à compiler encore:
def f:Function[SomeType,Option[AnotherType]] = {
case s1:SubType1 => AnotherType(s1.whatever)
case s2:SubType2 => AnotherType(s2.whatever)
}.lift
Que voulez-vous dire par fonction intermédiaire? – Raphael
@Raphael Une fonction littérale n'est pas une fonction littérale partielle, à moins qu'il n'y ait des indications de type indiquant le contraire. –
Ah, "j'ai" signifie "je code", pas "j'ai une valeur de type". Malentendu, désolé. – Raphael