Czy biblioteka Scala zapewnia wsparcie dla podnoszenia metody danego typu do wartości funkcji?Metody podnoszenia wartości funkcji w Scali
Załóżmy na przykład, że chcę podnieść String.length
. Mogę napisać
val f: String => Int = _.length
lub
val f = { s: String => s.length }
jednak składnia ta nie zawsze jest idealne (szczególnie pośród większej ekspresji). Myślę, że szukam czegoś, co pozwoli wyrażeń jak
Lift[String](_.length)
Lift[Option[Int]].lift(_.filter)
i mam na myśli coś takiego:
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]
}
Pytanie 1:Czy biblioteka standardowa (lub dowolnej biblioteki) dostarczyć coś takiego?
Pytanie 2: Jeśli nie, to możliwe, aby zapisać go w taki sposób, że można podnieść Option.filter
jak wyżej (zamiast jak Lift[Option[Int]].lift[Int => Boolean, Option[Int]](_.filter)
)? Bez podawania parametrów typu na metodzie lift
pojawia się następujący błąd:
error: missing parameter type for expanded function ((x$1) => x$1.filter) Lift[Option[Int]].lift(_.filter) ^
Aktualizacja:
Najwyraźniej problem biegnę, by coś zrobić z przeciążonej lift
metody. Jeśli zmienię nazwę przeciążenia, mogę podnieść podnieść Option.filter
bez wszystkich dodatkowych parametrów typu.
To działa, ale miałem nadzieję uzyskać '(Option [Int], (Int) => Boolean) => Opcja [Int]'. –
Wymyśliłem rozwiązanie, które zapewnia pojedynczą funkcję podnoszenia z prostą składnią, ale także daje kontrolę dzwoniącemu nad formą zniesionej funkcji (curry, częściowo curried lub uncurried). Zobacz http://stackoverflow.com/questions/4160239/lifting-methods-in-scala/4168990#4168990 jeśli jesteś zainteresowany. –