2016-07-11 2 views
0

Scalazの学習を始めました。ここでは、オプション、リストなどのようなコンテナを使用して使用することができるように、私はそれを持ち上げるようにしたい、私は(ちょうどそれのために)関数を定義したファンクタ(Scalaz7)を使用して暗黙のパラメータを取る関数を持ち上げる

trait Monoid[A] { 
    def mappend(a1: A, a2: A): A 
    def mzero: A 
} 

object Monoid { 
    implicit val IntMonoid: Monoid[Int] = new Monoid[Int] { 
     def mappend(a1: Int, a2: Int): Int = a1 + a2 
     def mzero: Int = 0 
    } 

    implicit val StringMonoid: Monoid[String] = new Monoid[String] { 
     def mappend(a1: String, a2: String): String = a1 + a2 
     def mzero: String = "" 
    } 
} 

trait MonoidOp[A] { 
    val F: Monoid[A] 
    val value: A 
    def |+|(a2: A): A = F.mappend(value, a2) 
} 

object MonoidOp{ 
    implicit def toMonoidOp[A: Monoid](a: A): MonoidOp[A] = new MonoidOp[A]{ 
     val F = implicitly[Monoid[A]] 
     val value = a 
    } 
} 

私のコード

def addXY[A: Monoid](x: A, y: A): A = x |+| y 

です。しかし、私はこの

def addXYOptioned = Functor[Option].lift(addXY) 

を行うときには、このような楽しさを持ち上げるためにerror: could not find implicit value for evidence parameter of type scalaz.Monoid[A] def addOptioned = Functor[Option].lift(addXY)

どのように言いますctions? Monoid[A]を必要とするが、addXYOptionedで使用されるので、あなたもaddXYOptionedMonoid制約を追加する必要があるときにスコープにはMonoid[A]ありませんaddXY

+0

2つのこと:(1)あなたの関数は、1つではなく2つの引数をとります(厳密に言えば、2つの引数リストを持っています。なぜなら、コンテキスト境界は暗黙的なパラメータなので)。 (2)私は、ファンクターでコンテキスト境界を使用することはできないと考えています。http://stackoverflow.com/questions/10849142/how-can-scalaz-functor-be-given-a-higher-kinded-コンテクストにバインドされた型。 – devkat

答えて

0

あなたの方法。

次の問題は、Functor.liftは機能A => Bを持ち上げるだけですが、Apply.lift2を使用して機能を持ち上げることができます。(A, B) => C Scalaz自体からMonoidを使用して

import scalaz._, Scalaz._ 

def addXY[A: Monoid](x: A, y: A): A = x |+| y 

def addXYOptioned[A: Monoid] = Apply[Option].lift2(addXY[A] _) 

我々はApplyインスタンスに任意の型のコンストラクタにaddXYを持ち上げることを可能にするaddXYOptionedを一般化できます。

def addXYApply[F[_]: Apply, A: Monoid] = Apply[F].lift2(addXY[A] _) 

addXYApply[List, Int].apply(List(1,2), List(3,4)) 
// List[Int] = List(4, 5, 5, 6) 

addXYApply[Option, Int].apply(1.some, 2.some) 
// Option[Int] = Some(3) 
関連する問題