【问题标题】:Implementing the Monad typeclass with a multi-parameter type用多参数类型实现 Monad 类型类
【发布时间】:2017-10-03 15:33:07
【问题描述】:

在 scala 中,我有一个带有错误案例和持有类型的容器类型:

case class Extract[E, A](runView: View => EitherT[Future, E, (A, View)]) {...}

我打算将其用作一种异步状态单子。我已经为此实现了所有mapflatMap 实用方法。

我现在想将此类型标记为 scalaz 中 Monad 类型类的成员,并且我正在努力制定语法来指定我想要类型 monadic 的类型参数是 A 类型,因为Monad 采用具有单个类型参数的类型。以下是我的错误尝试。

implicit def extractInterface[E] = new Monad[Extract[E, A]] {
    def point[A](a: => A): Extract[E, A] = {...}
    def bind[A, B](fa: Extract[E, A])(f: (A) => Extract[E, B]): Extract[E, B] = fa.flatMap(f)
}

我曾尝试查看 E \/ A 的 scalaz 实例,但它们使用 ? 类型参数,我找不到它的定义。

有什么语法技巧可以做我想做的事吗?

【问题讨论】:

    标签: scala syntax scalaz


    【解决方案1】:

    你应该使用type lambda

    implicit def extractInterface[E] = new Monad[({ type λ[A] = Extract[E, A] })#λ] {
      ...
    }
    

    您也可以使用kind-projector 插件。

    implicit def extractInterface[E] = new Monad[Extract[E, ?]] {
      ...
    }
    

    What is the ? type?

    【讨论】:

      猜你喜欢
      • 2021-02-02
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 2015-12-04
      相关资源
      最近更新 更多