2009-08-31 15 views
6

Estoy intentando crear una clase genérica con el tipo genérico siendo la subclase de Numérico (para asegurarme de que estoy tratando con números.) y probé "class NuVector[T<:Numeric[T])" como clase def y está compilando bien.scala: cómo crear un tipo genérico que sea subtipo de todas las clases de números en scala para que pueda incluir el método de comparación

Ahora quiero agregar PartiallyOrdered[T] a él. entonces hice lo siguiente:

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]] 
    } 

} 

no está compilando. El error que estoy recibiendo durante la compilación es:

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

versión Scala que estoy usando es 2,8

Cualquier ayuda es muy apreciada.

Gracias,
~ Tiger.
No sé si es un error o es un problema con mi definición.

+0

¿Qué versión exacta de Scala2.8 está utilizando? ¿Y esto está relacionado con el boleto 2274? (http://lampsvn.epfl.ch/trac/scala/ticket/2274) – VonC

Respuesta

7

Numeric[T] de Scala utiliza el "Typeclass Pattern". Realmente no tiene sentido decir class NuVector[T <: Numeric[T]]. Lo que quiere, en cambio, es class NuVector[T](implicit n: Numeric[T]).

+3

Y el atajo para esto es el "contexto vinculado" introducido en Scala 2.8: 'clase NuVector [T: Numérico]'. Donde esta 'T' está en el alcance, el parámetro de evidencia puede ser adquirido usando 'val num = implícitamente [Numérico [T]]'. –

5

aún mejor, utilice class NuVector[T:Numeric]

Esto también se conoce como un contexto ligado, y es sólo el azúcar sintáctica para class NuVector[T](implicit n: Numeric[T])

donde n es en realidad un nombre generado sintéticamente que no se puede acceder directamente a

Cuestiones relacionadas