Serialization 二郎';Haskell中的术语到二进制?

Serialization 二郎';Haskell中的术语到二进制?,serialization,haskell,binary,Serialization,Haskell,Binary,Haskell是否有类似于Erlang的term_to_binary/binary_to_term调用的无需大惊小怪的序列化方法?二进制看起来不必要的复杂和原始。查看您基本上是在哪里手动将术语编码为整数。使用Data.Binary和软件包附带的一个派生脚本 通过Data.Binay工具集中提供的“派生”或“派生”函数派生二进制实例非常简单 derive :: (Data a) => a -> String 对于数据中的任何“a”,它都会为您派生一个二进制实例作为字符串。还有一个pu

Haskell是否有类似于Erlang的term_to_binary/binary_to_term调用的无需大惊小怪的序列化方法?二进制看起来不必要的复杂和原始。查看您基本上是在哪里手动将术语编码为整数。

使用Data.Binary和软件包附带的一个派生脚本

通过Data.Binay工具集中提供的“派生”或“派生”函数派生二进制实例非常简单

derive :: (Data a) => a -> String
对于数据中的任何“a”,它都会为您派生一个二进制实例作为字符串。还有一个putStr版本,deriveM。 例如:

*Main>deriveM(未定义::饮料)
实例二元主。饮料在哪里
放(啤酒)=放(啤酒)=放(啤酒)=放
放咖啡
放茶
放置EnergyDrink=putWord8 3
放水
放酒
放威士忌
得到=做
标记获取>>=\a->返回(啤酒a)
1->返回咖啡
2->返茶
3->返回能量溜冰场
4->回水
5->返酒
6->返回威士忌
_->失败“无解析”

你举的例子是机器生成的输出的一个例子——是的,它都是最低级别的位!不过,不要用手来写——使用一个工具,通过反射为您推导出来。

非常好。非常感谢。没有提到这个脚本。
*Main> deriveM (undefined :: Drinks)
instance Binary Main.Drinks where
  put (Beer a) = putWord8 0 >> put a
  put Coffee = putWord8 1
  put Tea = putWord8 2
  put EnergyDrink = putWord8 3
  put Water = putWord8 4
  put Wine = putWord8 5
  put Whisky = putWord8 6
  get = do
    tag_ <- getWord8
    case tag_ of
      0 -> get >>= \a -> return (Beer a)
      1 -> return Coffee
      2 -> return Tea
      3 -> return EnergyDrink
      4 -> return Water
      5 -> return Wine
      6 -> return Whisky
      _ -> fail "no parse"