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】:

是的,您无法定义 putget。这能回答你的问题吗?

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 示例的主要内容,如果未能解决你的问题,请参考以下文章

haskell 列表中的唯一元素

源码ImProve:嵌入Haskell的命令式编程语言

Haskell 示例中的函数组合

此 Haskell 示例中数据构造函数中“Pt”的含义

在 .NET 中调用 Haskell 函数

阅读和学习的好 Haskell 源 [关闭]