在 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”没有重复两次,因此没有逻辑重复。
我想用新的 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”没有重复两次,因此没有逻辑重复。