F
にファンクタインスタンスがある場合、A => B
をF[A] => F[B]
に持ち上げることができます。
F
に利用可能なファンクタインスタンスがある場合は、A => B => C => .. => Z
をF[A] => F[B] => F[C] => .. => F[Z]
に持ち上げることができます。本質的には、適用可能なファンクタは、任意のアライドに対するファンクタの一般化です。
ファンクタと適用ファンクタhereとhereについて知ることができます。これらのアイデアをカバーする優れた講演もあります。this
Scalazライブラリは、これらの抽象化(とmore!)を提供します。
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
syntactially重いあるカリー機能はあまり使用されているので、ScalazはFunction2
、Function3
などにlift
方法を朝飯前。背後では、持ち上げはFunction1
(カルト機能)で行われます。
Scalaz source codeをご覧ください。
これは価値があるかもしれません:http://blog.tmorris.net/lifting/ –
http://www.scala-lang.org/api/current/index.html#scala.Function2を見てくださいタップル機能に気付く。 http://www.scala-lang.org/api/current/index.html#scala.Function$タップされたメソッドとuntupledメソッド。 – pedrofurla