2011-09-21 29 views
5

Estoy haciendo mi primera incursión en scalaz al convertir una clase existente para usar el rasgo Monoid. Lo que intento lograr es establecer una vista vinculada a mi parámetro de tipo de clase para asegurarme de que solo se puede usar con tipos que se pueden convertir implícitamente en un Monoid. Mi (simplificado) definición de clase es, por tanto:Usar una vista limita con scalaz

import scalaz._ 
import Scalaz._ 

case class Foo[T <% Monoid[T]](v: T) 

new Foo(42) 

Compilar este ejemplo simple da el error del compilador:

error: No implicit view available from Int => scalaz.Monoid[Int]. 

Anteriormente este punto de vista unido se define en contra de mi propia rasgo personalizado con una conversión implícita de T a el rasgo y esto funcionó bien.

¿Qué me estoy perdiendo ahora que he convertido esto en scalaz?

Gracias, Chris

Respuesta

9

Se supone que el uso de un contexto atado, y no un punto de vista ligado allí.

import scalaz._ 
import Scalaz._ 

case class Foo[T : Monoid](v: T) 

new Foo(42) 

La notación T : Monoid significa que hay una implícita de tipo Monoid[T] en su alcance. De hecho, desugars a lo siguiente:

case class Foo[T](v: T)(implicit ev: Monoid[T]) 

Esto se conoce como patrón de clase de tipo y se puede leer más sobre él here.

+0

Brillante. Gracias por tu ayuda. Sabía que era algo obvio. Gracias por el enlace, una buena lectura para más tarde. –