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

访问Dotty Scala中的嵌套类型参数,scala,class,monads,typeclass,dotty,Scala,Class,Monads,Typeclass,Dotty,我想使用新的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] } 但是编译器抱怨没有找到:类型A 是否有方法访问类型参数的类型参数?或者有相同的最终结果,但做得不同 我

我想使用新的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]
}
但是编译器抱怨没有找到:类型A

是否有方法访问类型参数的类型参数?或者有相同的最终结果,但做得不同

我知道您可以创建一个单子,如下所示: 但是拥有一个Monad类将允许我在它定义的同一个位置声明一个类a 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”不会重复两次,因此没有逻辑重复。

注释不用于扩展讨论;此对话已结束。我想知道是否可以使用匹配类型。很酷,它对您有效,这种编码称为F-有界多态性,并且有一些已知的限制/问题,请参阅以获取更多信息。我也不知道这对列表或IO(甚至是相同的
None
选项)是如何起作用的,但我们将看到如何长期运行。这很有趣,请查看它。是的,没有问题。它适用于null,但即使我不这么认为,这也不是一个好的解决方案。问题是构造函数不能作为纯函数,因为所有类型都必须存在一个构造函数,但例如,纯函数的任何分支都不会产生None。我要做的调整是将pure创建为它自己的函数。谢谢你的链接,我一定会查出来的。