![](/img/trans.png)
[英]Cannot call a function that accepts and returns an object of a self-referential parametrised type in a trait
[英]Self-referential duck-typing
我希望編寫一個函數,該函數可以處理任何可以添加到其自身類型的其他成員的值(無論“添加”在上下文中是什么意思)。 這種類型的明顯(嘿嘿)定義:
type Addable = { def +(a : Addable) : Addable }
這給了我一個我根本不懂的錯誤:遞歸方法+需要結果類型
為什么不是最后一個: Addable
結果類型? 為什么它認為+是遞歸的呢?
但我發現了一個更普遍的問題,試圖在自己的定義中引用一個類型:
type T = { def f: T }
但后來我有了一個腦波:用Java的方式解決它!
type T[T] = { def f: T }
這個匯編了!
但現在我還有兩個問題。
首先,我不知道如何使用T型。特別是,
def n(a:T) = a.f
給出完全明智但令人沮喪的“類型T取類型參數”錯誤。
其次,嘗試將此模式應用於原始問題
type Addable[Addable] = { def +(a : Addable) : Addable }
導致一個完全不可理解的“結構細化中的參數類型可能不會引用在該細化之外定義的抽象類型”。 (實際的問題並不在於它是“+” - 感謝上帝和馬丁,因為那會讓我的腦袋變得一團糟 - 只需要一個Addable作為參數。)
所以
我有一種宗教般的信念,認為這個問題是可以解決的。
那些是不同的Ts。
scala> type T[T] = { def f: T }
defined type alias T
scala> var x: T[Int] = null
x: T[Int] = null
scala> x = new AnyRef { def f = 5 }
x: T[Int] = $anon$1@44daa9f1
當你寫:
type Addable[Addable] = { def +(a : Addable) : Addable }
您有一個Addable類型,它接受一個類型參數,也稱為Addable。 這是一個人們經常混淆的類似變化。
scala> def f[Int](x: Int) = x * x
<console>:7: error: value * is not a member of type parameter Int
def f[Int](x: Int) = x * x
^
你的問題的實際答案是“你不能”,但我不想破壞你的宗教信仰,所以我會說“結構類型以神秘的方式運作”。 如果你想繼續執行宗教任務,你可以訪問這里,這就解釋了為什么你不能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.