问题描述
我想用新的 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 类将允许我在定义它的同一个地方将一个类声明为一个 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”不会重复两次,因此没有逻辑重复。