簡體   English   中英

自我指責鴨子打字

[英]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作為參數。)

所以

  1. 如何定義鴨子類型含義“有一個特定的函數返回相同類型的值”?
  2. 如何定義鴨子類型含義“有一個特定的函數采用與參數相同的表達式”?

我有一種宗教般的信念,認為這個問題是可以解決的。

那些是不同的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
                              ^

你的問題的實際答案是“你不能”,但我不想破壞你的宗教信仰,所以我會說“結構類型以神秘的方式運作”。 如果你想繼續執行宗教任務,你可以訪問這里,這就解釋了為什么你不能。

http://article.gmane.org/gmane.comp.lang.scala/7013

暫無
暫無

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

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