2011-03-16 15 views
8

Tengo un pequeño problema en Scala con un problema de tipeo. En Haskell, puedo hacer esto:Scala Typing: cómo asegurar el tipo numérico

add :: (Num a) => (a,a) -> (a,a) -> (a,a) 

De esa manera, se puede echar en add cualquier tipo que sea un valor numérico y soportes + etc. quiero lo mismo para una clase Scala, así:

case class NumPair[A <: Numeric](x: A, y: A) 

Pero eso no parece funcionar. Pero debido a la Scala Docs, Numeric[T] es el único rasgo que permite estas operaciones, y parece ser ampliado por Int, etc. Float

Algún consejo?

Respuesta

11
case class NumPair[A](x:A, y:A)(implicit num:Numeric[A]) 

La instancia Numeric sí misma no se extiende por Int, Float, etc., pero se proporciona como un objeto implícito. Para una explicación más larga, vea here.

+0

No estoy seguro de si me gustaría 'implícitos': son bastante agradables si quieres guardar el trabajo, pero a menudo destruyen el sistema de escritura al oscurecer el tipo de inferencia. – Lanbo

+1

¿De qué manera implicaría una inferencia de tipo oscura? - Si lo desea, puede hacer que la instancia 'Numeric' sea un parámetro explícito, pero siempre tendrá que pasarlo explícitamente, lo que es realmente redundante para tipos como' Int', 'Float', etc. Con implicits, usted tiene la opción de si desea pasarlo explícitamente o no. – Madoc

Cuestiones relacionadas