2012-07-11 14 views
6

Estaba tratando de resolver this problem con informe. Sin embargo, por alguna razón no puedo hacer un mapa en el HList. Dejaré que el código hable por sí mismo.No se puede asignar en HList

import shapeless._ 
import HList._ 

case class Foo(a: Option[Int], b: Option[Int]) 

val a = Foo(Some(3), None) 

val b = Foo(Some(22), Some(1)) 

implicit val fooIso = HListIso(Foo.apply _, Foo.unapply _) 

val mapper = new (({ type O2[+A] = (Option[A], Option[A]) })#O2 ~> Option) { 
    def apply[A](x: (Option[A], Option[A])): Option[A] = x._1.orElse(x._2) 
} 

fooIso.fromHList(fooIso.toHList(a).zip(fooIso.toHList(b)).map(mapper)) 

mensaje de error es:

<console>:55: error: could not find implicit value for parameter mapper: shapeless.Mapper[java.lang.Object with shapeless.~>[[+A](Option[A], Option[A]),Option],shapeless.::[(Option[Int], Option[Int]),shapeless.::[(Option[Int], Option[Int]),shapeless.HNil]]] 
       fooIso.fromHList(fooIso.toHList(a).zip(fooIso.toHList(b)).map(mapper)) 
                     ^

Por qué no funciona el mapeo?

Respuesta

10

Hay una solución fácil: basta con definir su función como un object en lugar de un val:

object f extends (({ type O2[+A] = (Option[A], Option[A]) })#O2 ~> Option) { 
    def apply[A](x: (Option[A], Option[A])): Option[A] = x._1 orElse x._2 
} 

(Tenga en cuenta que he llamado la función f en lugar de mapper para evitar la confusión con el mapper argumento implícito de map.)

no estoy seguro de que puedo ayudar con qué -en algún momento me trataron de resolver los detalles de por qué val no iba a funcionar para este tipo de cosas en el informe, y yo No recuerdo lo lejos que llegué.

+8

La implementación de Poly1 (y por lo tanto ~>) depende de poder nombrar un tipo de singleton correspondiente a la entidad similar a la función que se está definiendo, tal como está siendo definida. Esto transcurre sin problemas donde esa entidad es un objeto y el valor se instancia simultáneamente con la creación de un identificador estable; pero no tan suavemente donde esos dos están separados (creación de instancias a través de un nuevo explícito y creación de un identificador estable a través de la definición val). Esto tiene algún tipo de sentido, pero no puedo apuntar a justificar el texto en la especificación ... si cualquier otra persona puede, por favor avíseme. –

Cuestiones relacionadas