Wenn F
eine Funktorinstanz zur Verfügung hat, ist es möglich, jede Funktion A => B
auf F[A] => F[B]
zu heben.
Wenn F
über eine anwendbare Funktorinstanz verfügt, kann jede Funktion A => B => C => .. => Z
auf F[A] => F[B] => F[C] => .. => F[Z]
gehoben werden. Im wesentlichen ist der anwendungsbezogene Funktor eine Verallgemeinerung von Funktor für willkürliche Arität.
Sie können über Funktor und anwendungsbezogene Funktoren here und here lernen. Es gibt auch this ausgezeichnete Gespräche, die diese Ideen abdecken.
Scalaz Bibliothek bietet diese Abstraktionen (und mehr!).
import scalaz._
import Scalaz._
scala> val foo: Int => String = _.toString
foo: Int => String = <function1>
scala> foo.lift[Option]
res0: Option[Int] => Option[String] = <function1>
scala> res0(Some(3))
res1: Option[String] = Some(3)
scala> res0(None)
res2: Option[String] = None
scala> val add: (Int, Int) => Int = _ + _
add: (Int, Int) => Int = <function2>
scala> add.lift[Option]
res3: (Option[Int], Option[Int]) => Option[Int] = <function2>
scala> res3(Some(2), Some(1))
res4: Option[Int] = Some(3)
scala> res3(Some(2), None)
res5: Option[Int] = None
scala> res3(None, None)
res6: Option[Int] = None
Scalaz pimps lift
Methode auf Function2
, Function3
etc weil curried Funktionen syntactially schwerer weniger häufig verwendet werden. Hinter den Kulissen geschieht das Heben mit Function1
s (d. H. Curry-Funktionen).
Sie können auch einen Blick auf Scalaz source code werfen.
Dies könnte einen Blick wert sein: http://blog.tmorris.net/lifting/ –
Werfen Sie einen Blick auf http://www.scala-lang.org/api/current/index.html#scala.Function2 Beachten Sie die Tupelfunktion. Auch http://www.scala-lang.org/api/current/index.html#scala.Function$ tupled und unuplated Methoden. – pedrofurla