2012-07-11 15 views
6

Próbowałem rozwiązać this problem z bezkształtnym. Jednak z jakiegoś powodu nie mogę mapować na HList. Pozwolę kodowi mówić samo za siebie.Nie można mapować na 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)) 

Komunikat o błędzie jest:

<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)) 
                     ^

Dlaczego nie działa mapowanie?

Odpowiedz

10

Jest łatwo naprawić: wystarczy zdefiniować swoją funkcję jako object zamiast 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 
} 

(Zauważ, że ja o nazwie funkcja f zamiast mapper aby uniknąć nieporozumień z mapper niejawny argument map.)

nie jestem pewien, że mogę pomóc w dlaczego -w pewnym momencie próbował wypracować szczegóły dlaczego val nie będzie działać dla tego rodzaju rzeczy w bezkształtne, a ja nie pamiętam, jak daleko się dostałem.

+8

Implementacja Poly1 (a więc i>>) zależy od tego, czy można zdefiniować typ singletonu odpowiadający definiowanemu obiektowi podobnemu do funkcji, który jest zdefiniowany. Dzieje się to płynnie tam, gdzie ta jednostka jest obiektem, a wartość jest tworzona równocześnie z utworzeniem stabilnego identyfikatora; ale nie tak gładko, gdy te dwie są oddzielone (tworzenie przez wyraźne nowe i tworzenie stabilnego identyfikatora poprzez definicję val). To ma jakiś sens, ale nie mogę wskazać usprawiedliwiającego tekstu w specyfikacji ... ktoś inny może, proszę dać mi znać. –

Powiązane problemy