Scala 类型 class 参数:绑定和 subclassing - 类型不匹配

Scala types class parameter: binding and subclassing - type mismatch

菜鸟问题。我有以下基本特征(可以是抽象的 class):

trait EState[S, A] {
  def retrn(a: A): EState[S, A]
  def runState(s: S): (A, S)
}

稍后我将扩展为:

case class AState[S, A](val f: S => (A, S)) extends EState[S,A] {
  override def retrn(a: A): AState[S, A] = AState({ s: S => (a, s) })
  override def runState(s: S) = f(s)
}

我们的想法是像这样使用上面的任何实例:

case class StateMonad3[S, A, M[S,A] <: EState[S, A]](m : M[S,A]) {
  def retrn(a: A): EState[S, A] = m.retrn(a)
  def retrni(a: A): StateMonad3[S, A, M] = StateMonad3(m.retrn(a))
}

但是我收到以下错误:

[info] Compiling 1 Scala source to gnosis_server/target/scala-2.10/classes...
[error] gnosis_server/examples/lang/scala/StateMonad.scala:138: type mismatch;
[error]  found   : lang.scala.EState[S,A]
[error]  required: M[S,A]
[error]   def retrni(a: A): StateMonad3[S, A, M] = StateMonad3(m.retrn(a))
                                                                      ^

我假设 M[S,A] 对任何子 class EState[S,A] 都有效。所以 构造函数应该工作。但是 MEState 好像不一样 这里。这实际上应该如何编码?

此外,我怀疑 MEState 中的 SA 不是同一类型。这是正确的还是他们有约束力?如果不是怎么办 应该设置这个吗?

注意:我在网站上进行了搜索,发现了一些关于隐含函数的使用及其在转换中的使用的参考资料,但我想出了如何做到这一点。我想避免使用这样的(至少在我看来是这样的)verbose/complicated 解决方案。

TIA。

如果你看一下 StateMonad3(m.retrn(a)) 片段,m.retrn(a) returns EState[S, A] 但是 StateMonad3 应用函数需要 M[S, A]EState[S, A]子class。完全相同的推理,你不能将 AnyVal 传递给接受 Int.

的函数

还有一个改进,您在 AState 的定义中使用的 val 关键字是多余的。 case class 应用函数参数默认为 val 并且将被定义为 case class 字段。