5

符合遇到問題,類型爲「種」:種不與類型拉姆達

trait Sys[ S <: Sys[S]] 
trait Expr[S <: Sys[S], A] 
trait Attr[S <: Sys[S], A[_]] 
def test[ S <: Sys[S]]: Attr[S, ({type l[x<:Sys[x]]=Expr[x,Int]})#l] = ??? 

這種失敗

error: kinds of the type arguments (S,[x <: Sys[x]]Expr[x,Int]) do not conform 
to the expected kinds of the type parameters (type S,type A) in trait Attr. 
[x <: Sys[x]]Expr[x,Int]'s type parameters do not match type A's expected parameters: 
type x's bounds <: Sys[x] are stricter than type _'s declared bounds >: Nothing <: Any 
      def test[S <: Sys[S]]: Attr[S, ({type l[x<:Sys[x]]=Expr[x,Int]})#l] = ??? 
           ^

什麼是與申報範圍的問題嗎?我是否需要將這個cr * ppy部分應用類型攜帶到trait Attr的類型構造函數中?爲什麼?我可以修復此問題而不觸及Attr的定義嗎?

我需要爲了在功能test邊界的實施工作,但我不希望增殖這些邊界的公共接口Attr


注意:如果我使用一個類型成員(我不想要的東西),它的工作原理:

trait Attr[S <: Sys[S]] { type A[_]} 
def test[ S <: Sys[S]]: Attr[S] { type A[S <: Sys[S]] = Expr[S, Int]} = ??? 

回答

4

當你觀察到的,你不能總是錯配邊界時提供更高級的類型參數。有趣的是,它實際上是一個變化的問題:

class A 
class B extends A 
trait NeedsNeedsA[T[S <: A]] 
trait NeedsNeedsB[T[S <: B]] 
trait NeedsA[S <: A] 
trait NeedsB[S <: B] 

def x: NeedsNeedsA[NeedsB] // fails 
def y: NeedsNeedsB[NeedsA] // works 

這是有道理的,如果你認爲一個kinded更高型作爲其參數的綁定類型上的函數,逆變的。

有趣的是,在結構類型,這是在表面上有很多像子類型,Scala沒有得到相同的錯誤:

def t: MemberNeedsA { type T[S <: B] } 
def u: MemberNeedsB { type T[S <: A] } 

的原因是一結構型式是有點像的交點:

def s: MemberNeedsA with MemberNeedsB 

它可能是該交叉點實際上不能在自然界中存在,但斯卡拉不檢查。

好的,但這與您的問題沒有太大的關係。回到你的問題:我認爲你有一個方差問題。你想test給主叫方回一個AttrAttr posseses一種功能(A[_]),你想說,這Attr有需要更具體參數類型功能。我認爲你可以明白爲什麼你不應該被允許這樣做 - 這是你不能用需要更具體論證的函數取代需要更一般論證的函數的原因。

在這一點上恐怕解決方案將不得不取決於你想要什麼Attr能夠完成。你需要弄清楚爲什麼你需要在某些情況下限制類型參數。如果它使你的程序概念的意義上說,「一些Attr s爲比別人更嚴格」,你可以定義:

trait Attr[S <: Sys[S], B[Y <: B[Y]], A[X <: B[X]]] 
def test[S <: Sys[S]]: Attr[S, Sys, L] = ... 

但該解決方案將依靠什麼在A[_]的參數限制是指。

+0

感謝您的分析。它是有道理的,雖然「有一個'A [_]'」,而它允許你調用「類型構造函數」A [Any]',你不能調用一個值構造函數,所以就運行時而言這可能沒問題IMO。另一方面,我想這可能會導致使用類型約束的編譯時元編程的問題?最後,解決方案(至少我一直在使用它)很簡單。無論如何,使用站點不能用'A [_]'做很多事情,這種類型的信息更多地用於'test'的調用者,所以我用'Attr'替代'A1 = A [_]',然後'test'返回' Attr [S,Expr [S,Int]]'。 –