[英]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]
。 因此,構造函數應該可以工作。 但似乎M
和EState
在這里不同。 實際上應該如何編碼?
另外,我懷疑M
和EState
中的S
和A
不是同一類型。 這是正確的還是被束縛了? 如果沒有,應該如何設置?
注意:我在該網站上進行了搜索,找到了一些有關隱式用法及其在轉換中的用法的引用,但可能想出了辦法。 我想避免使用冗長/復雜的解決方案(至少在我看來是如此)。
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.