簡體   English   中英

Scala類型類參數:綁定和子類化-類型不匹配

[英]Scala types class parameter: binding and subclassing - type mismatch

Noobe問題。 我具有以下基本特征(可以是抽象類):

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]對任何子類EState[S,A] 因此,構造函數應該可以工作。 但似乎MEState在這里不同。 實際上應該如何編碼?

另外,我懷疑MEState中的SA不是同一類型。 這是正確的還是被束縛了? 如果沒有,應該如何設置?

注意:我在該網站上進行了搜索,找到了一些有關隱式用法及其在轉換中的用法的引用,但可能想出了辦法。 我想避免使用冗長/復雜的解決方案(至少在我看來是如此)。

TIA。

如果看一下StateMonad3(m.retrn(a))件, m.retrn(a)返回EState[S, A]但StateMonad3應用函數需要M[S, A] ,這是EState[S, A]子類。 AnyVal同樣的原因,您不能將AnyVal傳遞給接受Int的函數。

另一個改進是,您在AState定義中使用的val關鍵字是多余的。 case class apply函數的參數默認為val ,並且將被定義為case class字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM