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
で使用されるので、あなたもaddXYOptioned
にMonoid
制約を追加する必要があるときにスコープにはMonoid[A]
ありませんaddXY
2つのこと:(1)あなたの関数は、1つではなく2つの引数をとります(厳密に言えば、2つの引数リストを持っています。なぜなら、コンテキスト境界は暗黙的なパラメータなので)。 (2)私は、ファンクターでコンテキスト境界を使用することはできないと考えています。http://stackoverflow.com/questions/10849142/how-can-scalaz-functor-be-given-a-higher-kinded-コンテクストにバインドされた型。 – devkat