haskell Data.Binary 示例
Posted
技术标签:
【中文标题】haskell Data.Binary 示例【英文标题】:haskell Data.Binary example 【发布时间】:2012-08-08 00:02:00 【问题描述】:我正在尝试序列化 Contacts 类型,但我一直在定义 put 和 get?
import Control.Monad
import Data.Binary
type Name = String
type Address = String
data Contacts = Contacts [(Name, Address)] deriving (Show)
instance Binary Contacts where
put (Contacts [(n,a)]) = do ...
get = do ...
main :: IO ()
main = do
let c = Contacts [("gert","home")]
let e = encode c
let d = decode e
print d
【问题讨论】:
向我解释为什么像 this 这样的问题得到 +40 而我的得到 -1? 还有他们在***.com/faq 中的任何内容会使这个问题成为一个坏问题吗? IMO 您的问题往往有点含糊不清,而且涉及到无关紧要的、特定于域的代码(尽管这不是)。我认为通过更详细地隔离一个编程问题,而不是问“我的代码有什么问题”,你会做得更好。查看几个highly-voted questions tagged with haskell,了解是什么让他们成功。还有准确的***.com/questions/how-to-ask。 如果您是 Haskell 的新手,那么您绝对不可能从 code.haskell.org/binary 转到我得到的答案。我尝试的所有代码都没有任何意义,只会混淆问题。如果你用谷歌搜索haskell Data.Binary example
,你甚至会看到我自己的问题在前 10 名结果中,因为缺少其他示例。如果您为 js java c c# bash 执行此操作...您将获得大量数据来查看。
最后,我似乎只是要求 2 行代码来帮助我。
【参考方案1】:
是的,您无法定义 put
和 get
。这能回答你的问题吗?
type Name = String
type Address = String
data Contacts = Contacts [(Name, Address)] deriving (Show)
instance Binary Contacts
put (Contacts [(n,a)]) = do ...
get = do ...
既然已经有实例:
instance (Binary a) => Binary [a]
instance (Binary a, Binary b) => Binary (a,b)
instance Binary Char
您应该能够轻松地解除底层的 put 和 get 例程:
instance Binary Contacts where
put (Contacts set) = put set
get = fmap Contacts get
因此,当您放置联系人时,您只需告诉它放置字符串对列表。当您想要反序列化联系人时,您只需获取底层列表并使用 Contacts
构造函数。
【讨论】:
在这里发现了一点讽刺 :) 无论如何需要时间来解码答案,我相信它是正确的。 我必须使用 Data.Serialize 然后instance Serialize Contacts
而不是 instance Binary Contacts
对吗?
您能否在回答中反映 Data.Binary 级别太低并建议使用序列化?还是我错过了重点?
Gert:我编辑坚持使用二进制。 Binary
应该适合你,我通常只使用 Serialize
(来自 cereal
包),因为它更适合我的需求。
当您解码某些内容时,您需要明确说明类型(解码类型为ByteString -> a
,那么a
是什么?)。为了您的使用,请尝试print (d :: Contacts)
或将类型放在let
语句中。【参考方案2】:
添加更简单的示例以防止其他菜鸟像我一样受苦:)
-# LANGUAGE RecordWildCards #-
import Data.Binary
type Name = String
type Address = String
type Phone = String
data Contacts = Contacts [(Name, Address)] deriving (Show)
instance Binary Contacts where
put (Contacts set) = put set
get = fmap Contacts get
data Contact = Contact name :: Name, address :: Address, phone :: Phone deriving (Show)
instance Binary Contact where
put Contact.. = do put name; put address; put phone
get = do name <- get; address <- get; phone <- get; return Contact..
main :: IO ()
main = do
let c = Contacts [("gert","home"),("gert2","home2")]
let e = encode c
print e
let d = decode e
print (d:: Contacts)
let c' = Contactname="gert",address="home",phone="test"
let e' = encode c'
print e'
let d' = decode e'
print (d':: Contact)
【讨论】:
以上是关于haskell Data.Binary 示例的主要内容,如果未能解决你的问题,请参考以下文章