SCodecの新しいユーザーとして、かなりの学習曲線があります。私は、ソースとドキュメントを読んでいても解決できないような障害にぶつかった。任意のネストされたコーデックを平坦化しますか?
私はこの
def packedByte : Codec[Int :: Int :: Int :: HNil] = uint(4) :: uint(2) :: uint(2)
のような関数として人気の高いコーデックを定義し、この
case class MyPacket(foo : Boolean, first : Int, second : Int, third : Int, bar : Boolean)
def packet : Codec[MyPacket] = (bool :: packedByte :: bool).as[MyPacket]
のようなケースクラスから上位レベルにデコードし、このようなコーデックやエンコードにしてそれらを結合することができるようにしたいです
しかし、これは
はそのshapeless.::[Boolean,shapeless.::[shapを証明することができませんでしたと言って動作しません。 eless.::[Int,shapeless.::[Int,shapeless.::[Int,shapeless.HNil]]],shapeless.::[Boolean,shapeless.HNil]]]はcmd504.MyPacketに変換できます。 。
def packetInline : Codec[MyPacket] = (bool :: uint(4) :: uint(2) :: uint(2) :: bool).as[MyPacket]
すべてのようなI "インライン"
packedByte
は、コンパイルしたときに、予想通り
しかし、動作します。私の直感は、コーデックは(エラーメッセージの2つのHNilsに基づいて) "平坦化"する必要があると言いますが、コーデック自体または内部のHList表現を平坦化できませんでした。
最後に ':: HNil'なしでこれがどのように動作するのでしょうか? –
@Łukasz[このメソッド](https://github.com/scodec/scodec/blob/v1.8.3/shared/src/main/scala/scodec/package.scala#L269) - 特別なScodec演算子です。シェイプレスの '::'ではありません。 –
よろしくお願いします!それを知らなかった。 –