如何将类型约束为特征中的抽象类型成员?

时间:2014-12-26 11:15:48

标签: scala types traits

我想用抽象类型定义以下特征:

trait C {
  type M[_]

  def doSomething(m: M[T]): M[T] = ???
  def somethingElse: M[T] = ???
}

我想限制我的更高类型M拥有scalaz.Monad[M]个实例。一种解决方案是改变我的代码,如:

abstract class C[M: Monad] { ... }

但我希望M成为抽象类型的成员。这在Scala中是否可行?

1 个答案:

答案 0 :(得分:1)

如果您想要Monad[M]个实例,只需...需要它:

trait C {
  type M[_]
  /*implicit if you like*/ def m: Monad[M]
  ...
}

遗憾的是,实现类必须指定m,如果仅作为val m = implicitly;唯一的解决方法就是你提到的abstract class方法。