2010-10-27 172 views
4

我已經創建了一個可以通過什麼進行參數設置一類,它可以在代碼的其他地方被轉換成數字斯卡拉 - 詮釋對數值[INT]隱式轉換

class Complex[T <% Numeric[T]] (val real : T, val imag : T) { 
    //... complex number methods ... 
} 

然後我嘗試:

var myComplex = new Complex(0, 1) 

這會引發編譯錯誤,因爲(令人驚訝的是)Int和Numeric [Int]之間或Int和Integral [Int]之間沒有隱式轉換。

我錯過了什麼嗎?有沒有一種隱式轉換,我沒有看到?

在Numeric.scala中定義了一個名爲IntIsIntegral的隱式對象。我用這個來創建自己的隱式轉換方法的嘗試:

def implicit intToNumericInt(val i : Int)(implicit n : IntIsIntegral) = n.fromInt(i) 

我很驚訝,這是必需的,無論如何,這似乎導致無限遞歸到.fromInt方法。我敢肯定,我錯過了一些基本的東西(正如你可以說的,我是斯卡拉的新手),所以在正確的方向上我會感激一點。

從示例中可以看出,我試圖獲得一個可以接受和使用任何數字類型的複雜數字實現。我希望將這個貢獻給scalala(線性代數)項目。接下來,我想介紹一個描述矩陣元素責任的特性(主要是+和*運算符),並將複數的支持加入到矩陣操作庫中。

回答

9

您錯誤地使用了它。正確的用法是這樣的:

class Complex[T](val real : T, val imag : T)(implicit num: Numeric[T]) { 
    import num._ // make implicit conversions available 
    //... complex number methods ... 
} 

這是相同的區別在OrderedOrdering之間。一個Ordered[T]實例可以與T進行比較,而Ordering[T]提供了一種比較幾個T的方法。

+0

從我明白,則: Ť<%數值[T] 是用於將語法糖(隱式NUM:數字[T]) 但我想使用糖意味着我沒有可變可以做的: import num._ //使隱式轉換可用 我確實嘗試過(隱含的num:Numeric [T]),但它不適用於我。明天我會報告是否導入num._幫助!謝謝。 – 2010-10-27 13:06:14

+2

@David:'T <%Numeric [T]'是添加'(隱式ev:T =>數字[T])'的語法糖,'T:Numeric [T]'是一個語法糖, (隱含的ev:數字[T])'。第一個被稱爲視圖邊界,第二個被稱爲類型邊界。 – missingfaktor 2010-10-27 13:24:57

+2

@missingfaktor第二個稱爲上下文綁定,恰好用於類型模式。 – 2010-10-27 13:28:47

2

在斯卡拉2.8,它也可以寫成

class Complex[T: Numeric] (val real : T, val imag : T) { 

    def +(that: Complex[T]) = { 
    val r = implicitly[Numeric[T]].plus(this.real, that.real) 
    val i = implicitly[Numeric[T]].plus(this.imag, that.imag) 
    new Complex(r, i) 
    } 

} 

這句法毫無疑問是個有點遲鈍,但它可以更加可讀這樣的:

class Complex[T: Numeric] (val real : T, val imag : T) { 
    val num = implicitly[Numeric[T]] 

    def +(that: Complex[T]) = { 
    new Complex(num.plus(this.real, that.real), num.plus(this.imag, that.imag)) 
    } 

} 

聲明class C[T: M](...) { val x = implicitly[M[T]]會似乎相當於class C[T](...)(implicit x: M[T]) { import x._,如前面解決方案的評論中所述。它不是簡單的句法糖,因爲它在編譯過程中存在差異,例如,在第一種情況下,x是一種方法,在第二種情況下,它是一個字段。

+0

看起來這樣做也可以,在這個階段,我認爲使用import num._(隱含的num:Numeric [T])更清晰,而不是使用隱含的操作,像魔術:)如果我不想從Numeric導入方法,那麼語法你建議一定會更清潔。 – 2010-10-28 16:26:21

+0

我已更新答案,將您的評論納入考慮範圍。 – 2010-10-29 15:07:37