La bibliothèque Scala permet-elle de transformer une méthode d'un type donné en une valeur de fonction ?
Par exemple, supposons que je veuille lever String.length
. Je peux écrire
val f: String => Int = _.length
ou
val f = { s: String => s.length }
Toutefois, cette syntaxe n'est pas toujours idéale (en particulier au milieu d'une expression plus large). Je pense que je cherche quelque chose qui permette des expressions comme
Lift[String](_.length)
Lift[Option[Int]].lift(_.filter)
et je pense à quelque chose comme ça :
class Lift[T] {
def apply[R](f: T => R): T => R = f
def lift[A, R](f: (T) => (A) => R): (T, A) => R =
f(_)(_)
def lift[A1, A2, R](f: (T) => (A1, A2) => R): (T, A1, A2) => R =
f(_)(_,_)
// ... etc. ...
}
object Lift {
def apply[T] = new Lift[T]
}
Question 1 : La bibliothèque standard (ou toute autre bibliothèque) propose-t-elle quelque chose de ce type ?
Question 2 : Si ce n'est pas le cas, est-il possible de l'écrire de manière à ce que Option.filter
peut être levé comme ci-dessus (plutôt que comme Lift[Option[Int]].lift[Int => Boolean, Option[Int]](_.filter)
) ? Sans fournir les paramètres de type sur la page lift
J'obtiens l'erreur suivante :
error: missing parameter type for expanded function ((x$1) => x$1.filter)
Lift\[Option\[Int\]\].lift(\_.filter)
^
Mise à jour :
Apparemment, le problème auquel je me heurte est lié à la surcharge du système d'information. lift
méthode. Si je renomme les surcharges, je puede ascenseur Option.filter
sans tous les paramètres de type supplémentaires.