使用函子(Scalaz7)提升带隐式参数的函数 [英] Lifting a function which takes implicit parameter using functor (Scalaz7)

查看:32
本文介绍了使用函子(Scalaz7)提升带隐式参数的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

刚开始学习Scalaz.这是我的代码

Just started learning Scalaz. Here is my code

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
    }
}

我定义了一个函数(只是为了它)

I have defined a function (just for the sake of it)

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

我想提升它,以便它可以使用 Option、List 等容器使用.但是当我这样做时

I want to lift it so that it could be used using Containers like Option, List, etc. But when I do this

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

它说错误:找不到scalaz.Monoid[A]类型的证据参数的隐式值def addOptioned = Functor[Option].lift(addXY)

如何提升这样的功能?

推荐答案

你的方法 addXY 需要一个 Monoid[A] 但没有 Monoid[A]addXYOptioned 中使用时在作用域内,因此您还需要将 Monoid 约束添加到 addXYOptioned.

Your method addXY needs a Monoid[A] but there is no Monoid[A] in scope when used in addXYOptioned, so you also need to add the Monoid constraint to addXYOptioned.

下一个问题是Functor.lift 只提升一个函数 A =>B,但我们可以使用 Apply.lift2 提升一个函数 (A, B) =>C.

The next problem is that Functor.lift only lifts a function A => B, but we can use Apply.lift2 to lift a function (A, B) => C.

使用 Scalaz 本身的 Monoid :

Using the Monoid from Scalaz itself :

import scalaz._, Scalaz._

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

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

我们可以概括 addXYOptioned 以将 addXY 提升到具有 Apply 实例的任何类型构造函数中:

We could generalize addXYOptioned to make it possible to lift addXY into any type constructor with an Apply instance :

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)

这篇关于使用函子(Scalaz7)提升带隐式参数的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆