Biorąc pod uwagę Shapeless HList, gdzie każdy element listy współużytkuje ten sam typ konstruktora, w jaki sposób HList może być sekwencjonowane?Sequencing a HList
Na przykład:
def some[A](a: A): Option[A] = Some(a)
def none[A]: Option[A] = None
val x = some(1) :: some("test") :: some(true) :: HNil
val y = sequence(x) // should be some(1 :: "test" :: true :: HNil)
def sequence[L <: HList : *->*[Option]#λ, M <: HList](l: L): Option[M] =
???
starałem się wdrożyć sekwencję tak:
object optionFolder extends Poly2 {
implicit def caseOptionValueHList[A, B <: HList] = at[Option[A], Option[B]] { (a, b) =>
for { aa <- a; bb <- b } yield aa :: bb
}
}
def sequence[L <: HList : *->*[Option]#λ, M <: HList](l: L): Option[M] = {
l.foldRight(some(HNil))(optionFolder)
}
Ale to nie skompilować:
could not find implicit value for parameter folder: shapeless.RightFolder[L,Option[shapeless.HNil.type],SequencingHList.optionFolder.type]
jakieś wskazówki na wdrożenie tego do albo konkretny przykład, taki jak Option czy arbitralny Applicative?
Dzięki! Próbowałem dostarczyć ukryty RightFolder przed wysłaniem, ale podbiegł dokładnie do błędu, który wskazałeś powyżej (wymagane 'F [M]', ale znalazłem 'folder.Out'). RightFolderAux wyjaśnia to. – mpilquist
Właśnie próbowałem implementacji sekwencji z Shapeless 2.0 i otrzymałem ten błąd: Błąd: (41, 36) nie mógł znaleźć niejawnej wartości dla folderu parametrów: shapeless.ops.hlist.RightFolder [L, Option [shapeless.HNil], optionFolder. type] l.foldRight (Opcja (HNil: HNil)) (opcjaFolder) ^ –
@ChanningWalton: Czy wystąpił błąd przed tym? Czy zaimportowałeś 'shapeless.ops.hlist.RightFolder'? Działa dla mnie w wersji 2.0.0. –