Ich versuche, einen Kombinator für die scodec Bibliothek zu schreiben, die eine Codec[K]
in eine Codec[L]
umwandelt, wo K
ein HList
und L
ist die entfernt Äquivalent HList
mit allen Unit
Elementen ist.Shapeless: Inversion von filterNot auf einem hList
Die Implementierung der Dekodierung kann durch Dekodieren eines K
und anschließendes Ausfiltern aller Unit
Elemente erfolgen. Herausfiltern Unit
Elemente wird direkt von formlos mit filterNot
unterstützt, die diese trivial zu implementieren macht.
Implementierung Codierung wird erreicht, indem ein auf eine L
K
Umwandlung ()
an den entsprechenden Indizes Einfügen und dann auf die ursprüngliche Codec[K]
delegieren. Ich habe Probleme beim Implementieren der L => K
Konvertierung.
def dropUnits[K <: HList, L <: HList](codec: Codec[K])(
implicit fltr: FilterNot.Aux[K, Unit, L]): Codec[L] = new Codec[L] {
override def decode(buffer: BitVector) =
codec.decode(buffer).map { case (rest, l) => (rest, l.filterNot[Unit]) }
override def encode(xs: L) = {
???
}
}
Ich habe ein paar verschiedene Lösungen ohne Glück ausprobiert. Ist das mit formlos möglich?
Es ist vielleicht erwähnenswert, dass dies Instanzen überfordert - es wird zum Beispiel eine 'ReUnit [Unit :: HNil, Unit :: HNil]' 'finden. Das mag kein Problem für Sie sein, aber wenn Sie es sind, können Sie einfach 'H =!: = Unit' Beweise zu' hlistListReUnit' hinzufügen. –
Danke - Ich habe die Einschränkung 'FilterNot.Aux [K, Unit, L]' in 'ReUnit' übernommen. Nicht sicher, wie ich über das Ergebnis fühle: https://github.com/scodec/scodec/commit/3987a842f97bc0049672d61b4f2c7f526028da4e#diff-d41d8cd98f00b204e9800998ecf8427e – mpilquist
Diese Art der Aufspaltung scheint mir etwas weniger klar, und ich sehe nicht warum Sie müssen 'LH' und' KH' duplizieren, wenn Sie dieselben benötigen. –