2009-08-31 13 views
6

を含めることができるようにScalaの中のすべての数のクラスのサブタイプであるジェネリック型を作成する私は、私が取り扱っておりますことを保証するために、数値(のジェネリック型ビーイングサブクラスでジェネリッククラスを作成しようとしています数字の場合) と私は "class NuVector[T<:Numeric[T])"をクラスdefとして試してみました。スカラ:それはどのように比較する方法

今、私はそれにPartiallyOrdered[T]を追加したいです。私は次のようにしました:

class NuVector[T<:Numeric[T]) extends PartiallyOrdered[T] 
{ 

/** Array that stores the vector values. 
    */ 
    val v = new Array [T] (_length) 
    /** Range for the storage array. 
    */ 
    private val range = 0 to _length - 1 

    def compare(x:T,y:T)(implicit res:Numeric[T]) :Int= 
    { 
     res.compare(x,y) 
    } 

    def tryCompareTo [B >: NuVector [T]] (b: B) 
     (implicit view$1: (B) => PartiallyOrdered [B]): Option [Int] = 
    { 
     compare(x,y) 
    } 

    implicit def castT2Ordering(x:T):Numeric[T]=x.asInstanceOf[Numeric[T]] 
    implicit def castB2NuVector [B>:NuVector[T]] (b:B): NuVector[T]= 
    { 
       b.asInstanceOf[NuVector[T]] 
    } 

} 

コンパイル中です。 コンパイル中に私が取得していますエラーは次のとおりです。私は使用しています

could not find implicit value for parameter res:Numeric[T] 

Scalaのバージョンは2.8

すべてのヘルプは大歓迎です。

おかげで、
〜タイガー。
バグか自分の定義に問題があるかどうかはわかりません。

+0

Scala2.8の正確なバージョンは何を使用していますか?これはチケット2274と関連していますか? 'クラスNuVector [T:数値]'(http://lampsvn.epfl.ch/trac/scala/ticket/2274) – VonC

答えて

7

ScalaのNumeric[T]"Typeclass Pattern"を使用しています。 class NuVector[T <: Numeric[T]]と言っても意味がありません。代わりに、あなたが望むのはclass NuVector[T](implicit n: Numeric[T])です。さらに良い

+3

そして、このショートカットはスカラ2.8で導入された「コンテキストバインド」です。この 'T 'が有効範囲にある場合、証拠パラメータは' val num = implicitly [Numeric [T]] 'を使って取得できます。 –

5

、これはまたバインドコンテキストとして知られており、nは実際にあなたが直接

にアクセスすることはできませんいくつかの合成的に生成された名前である class NuVector[T](implicit n: Numeric[T])

のためだけの構文糖ですclass NuVector[T:Numeric]

を使用

関連する問題