functor インスタンスが利用可能な場合、任意の関数をF
に持ち上げることができます。A => B
F[A] => F[B]
Applicative functor インスタンスが利用可能な場合、任意の関数をF
に持ち上げることができます。基本的に、アプリケーション ファンクターは、任意のアリティのファンクターを一般化したものです。A => B => C => .. => Z
F[A] => F[B] => F[C] => .. => F[Z]
functor と applicative functor については、こことここで学ぶことができます。これらのアイデアをカバーするこの優れた講演もあります。
Scalaz ライブラリはこれらの抽象化 (およびそれ以上!) を提供します。
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
カリー化された関数は構文的に重いため、あまり使用されないため、 Scalazlift
は on などのメソッドをpimpします。舞台裏では、リフティングはs (つまり、カリー化された関数) で行われます。Function2
Function3
Function1
Scalaz のソース コードも参照してください。