使用多参数类型

时间:2017-10-03 15:33:08

标签: scala syntax scalaz

在scala中,我有一个容器类型,其中包含错误大小写并保持类型:

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

我打算将其用作一种异步状态monad。我为此实现了所有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实例,但是他们使用?类型参数,我无法找到定义。

是否有语法技巧可以做我想要的事情?

1 个答案:

答案 0 :(得分:3)

您应该使用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?