La bibliothèque Scala fournit-elle un support pour lever une méthode d'un type donné vers une valeur de fonction? Par exemple, supposons que je veuille lever String.length
.Méthodes de levage pour les valeurs de fonction dans Scala
Je peux écrire
val f: String => Int = _.length
ou
val f = { s: String => s.length }
Cependant, cette syntaxe est pas toujours idéale (surtout au milieu d'une expression plus large). Je pense que je suis à la recherche de quelque chose qui va permettre à des expressions comme
Lift[String](_.length)
Lift[Option[Int]].lift(_.filter)
et j'ai à l'esprit quelque chose comme ceci:
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: Est-ce quela bibliothèque standard (ou une bibliothèque) fournir quelque chose comme ça?
Question 2: Sinon, est-il possible d'écrire de telle sorte que Option.filter
peut être soulevé 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 méthode lift
j'obtenir 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 que je suis en cours d'exécution pour a quelque chose à voir avec la méthode lift
surchargé. Si je renomme les surcharges, je peux soulever Option.filter
sans tous les paramètres de type supplémentaires.
Cela fonctionne, mais j'espérais obtenir un '(Option [Int], (Int) => Boolean) => Option [Int]'. –
Je suis venu avec une solution qui fournit une fonction de levée unique avec une syntaxe simple, mais qui donne également à l'appelant le contrôle sur la forme de la fonction levée (curry, partiellement curry, ou non). Voir http://stackoverflow.com/questions/4160239/lifting-methods-in-scala/4168990#4168990 si cela vous intéresse. –