访问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]
}

但编译器抱怨"未找到:类型A ">

有什么方法可以访问类型参数的类型参数吗?或者最终结果相同但做法不同的东西?

我知道你可以在这里创建一个Monad:https://dotty.epfl.ch/docs/reference/contextual/type-classes.html但拥有一个Monad类可以让我在定义的同一个地方宣布一个类为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";不会重复两次,因此不存在逻辑重复。

最新更新