Jako nowy użytkownik SCodec, istnieje dość krzywej uczenia się. Uderzyłem w szkopuł, którego nie mogę rozwiązać pomimo czytania źródła i dokumentów.Spłaszczyć kodek zagnieżdżony dowolnie?
Chcę być w stanie określić popularnych kodeków, funkcje jak ten
def packedByte : Codec[Int :: Int :: Int :: HNil] = uint(4) :: uint(2) :: uint(2)
a następnie połączyć je w wyższych kodeków poziomie jak ten, który dekoduje do kodowania z klas takim wypadku
case class MyPacket(foo : Boolean, first : Int, second : Int, third : Int, bar : Boolean)
def packet : Codec[MyPacket] = (bool :: packedByte :: bool).as[MyPacket]
Ale to nie zadziała mówiąc
nie można udowodnić, że shapeless.::[Boolean,shapeless.::[shap eless.::[Int,shapeless.::Nie jest niewypowiedziany.::Niektowo nie jest bezużyteczny.HNyl]]], bezkształtny.::[Boolean,shapeless.HNil]]] można przekonwertować do/z cmd504.MyPacket .
Jednak kiedy "inline" THE packedByte
, jak
def packetInline : Codec[MyPacket] = (bool :: uint(4) :: uint(2) :: uint(2) :: bool).as[MyPacket]
Wszystko kompiluje i działa zgodnie z oczekiwaniami. Moja intuicja podpowiada mi, że kodek musi być "spłaszczony" (oparty na dwóch HNils w komunikacie o błędzie), ale nie byłem w stanie spłaszczyć samego Codec ani wewnętrznej reprezentacji HList.
dlaczego to działa bez ':: HNil' na końcu? –
@ Łukasz Zobacz [ta metoda] (https://github.com/scodec/scodec/blob/v1.8.3/shared/src/main/scala/scodec/package.scala#L269) - to specjalny operator Scodec, nie Shapeless's '::'. –
W porządku, dziękuję! Tego nie wiedziałem. –