在 Dotty Scala 中访问嵌套类型参数

Accessing nested type parameters in Dotty Scala

我想用新的 Scala Dotty 编译器做这样的事情:

trait Monad[M[A]] (underlyingValue:A) {
  def bind[A, B](f: A => M[B]): M[B]
}

或至少

class Monad[M[A]] (underlyingValue:A) {
  def bind[A, B](f: A => M[B]): M[B]
}

但是编译器报错 Not found: type A

有没有办法访问类型参数的类型参数?或者最终结果相同但做法不同的东西?

我知道你可以像这里一样创建一个 Monad:https://dotty.epfl.ch/docs/reference/contextual/type-classes.html 但是拥有 Monad class 将允许我在定义它的同一位置声明一个 class Monad,并且在我的风格上也更有意义。

有什么办法吗?

就其价值而言,以下解决方案满足我的标准:

trait Monad[F[_], A](underlyingValue: A) {

  def flatMap[B](f: A => F[B]):F[B]

}

用法如下:

class Opt[A](underlyingValue: A) extends Monad[Opt, A](underlyingValue: A) {
   def flatMap[B](f: A => Opt[B]):Opt[B] = {
     ...
   }
} 

虽然它确实需要两个类型参数,但类型参数“A”没有重复两次,因此没有逻辑重复。