ハスケルのバイナリデータをシリアライズ/デシリアライズするボイラープレートコードを削除し、エンディアンを考慮に入れて最適な方法はありますか?ハスケルでバイナリリトルエンディアンデータをデコード/エンコードするより良い方法は何ですか?
data Foobar = Foobar { foo :: Word16, bar :: Word32 }
そしてData.Binary.Binary
型クラスのインスタンスを派生:ビッグエンディアンとして
instance Binary Foobar where
get = do
foo <- get
bar <- get
return $ Foobar foo bar
decode stream :: Foobar
扱いのデータを、すなわち、この構造体を与えられました。
明白な方法はgetWord16le
/getWord32le
機能を使用することですが、それは(自動的にうまくderiveと相まってテンプレートハスケルによって行うことができる)、マニュアル作業の多くを必要とします。
おそらく、パラメータ化された型がソリューションですか?
バイナリの事前宣言されたインスタンスは常にビッグエンディアンではありませんか?ビッグエンディアンとリトルエンディアンの両方で作業することは、難解なエラーのレシピのように見えます。既存のリトルエンディアンのバイナリ形式でデータを記述して解析する場合は、バイナリのインスタンスを作成しないで、パーサーとシリアライザを型クラスなしで直接記述することをお勧めします。 –