Bei einem formlosen HList, bei dem jedes Listenelement denselben Typenkonstruktor verwendet, wie kann der HList sequenziert werden?Sequenzierung eines HLists
Zum Beispiel:
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] =
???
Ich versuchte Sequenz wie folgt umzusetzen:
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)
}
Aber das nicht kompiliert:
could not find implicit value for parameter folder: shapeless.RightFolder[L,Option[shapeless.HNil.type],SequencingHList.optionFolder.type]
Irgendwelche Tipps zu diesem Thema für die Umsetzung entweder ein spezifisches Beispiel wie Option oder für einen beliebigen Applicative?
Danke! Ich habe versucht, den impliziten RightFolder vor dem Posten zur Verfügung zu stellen, bin aber zu dem genauen Fehler gelaufen, den Sie oben angegeben haben (benötigt 'F [M]', aber gefunden 'folder.Out'). Der RightFolderAux macht das klar. – mpilquist
Ich habe gerade die Sequenz-Implementierung mit Shapeless 2.0 versucht und diesen Fehler erhalten: Fehler: (41, 36) konnte keinen impliziten Wert für den Parameterordner finden: formeless.ops.hlist.RightFolder [L, Option [formless.HNil], optionFolder. type] l.foldRight (Option (HNil: HNil)) (optionFolder) ^ –
@ChanningWalton: Gibt es davor einen Fehler? Haben Sie 'shapeless.ops.hlist.RightFolder' importiert? Es funktioniert für mich in 2.0.0. –