使用多参数类型实现 Monad 类型类
Implementing the Monad typeclass with a multi-parameter type
在 Scala 中,我有一个带有错误案例和保存类型的容器类型:
case class Extract[E, A](runView: View => EitherT[Future, E, (A, View)]) {...}
我打算将其用作一种异步状态 monad。为此,我已经实现了所有 map
、flatMap
实用方法。
我现在想在 scalaz 中将此类型标记为 Monad 类型 class 的成员,并且我正在努力制定语法来指定我想要 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 实例,但它们使用 ?
类型参数,我找不到其定义。
是否有句法技巧可以满足我的要求?
你应该使用type lambda
implicit def extractInterface[E] = new Monad[({ type λ[A] = Extract[E, A] })#λ] {
...
}
或者您可以使用 kind-projector 插件。
implicit def extractInterface[E] = new Monad[Extract[E, ?]] {
...
}
在 Scala 中,我有一个带有错误案例和保存类型的容器类型:
case class Extract[E, A](runView: View => EitherT[Future, E, (A, View)]) {...}
我打算将其用作一种异步状态 monad。为此,我已经实现了所有 map
、flatMap
实用方法。
我现在想在 scalaz 中将此类型标记为 Monad 类型 class 的成员,并且我正在努力制定语法来指定我想要 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 实例,但它们使用 ?
类型参数,我找不到其定义。
是否有句法技巧可以满足我的要求?
你应该使用type lambda
implicit def extractInterface[E] = new Monad[({ type λ[A] = Extract[E, A] })#λ] {
...
}
或者您可以使用 kind-projector 插件。
implicit def extractInterface[E] = new Monad[Extract[E, ?]] {
...
}