WebHU - Programozási kérdések és válaszok

haskell Data.Bináris példa

Megpróbálok szerializálni egy névjegytípust, de elakadtam a put and 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
10.08.2012


Válaszok:


1

Igen, elakadtál a put és a get meghatározásánál. Ez választ ad a kérdésedre?

type Name = String
type Address = String

data Contacts = Contacts [(Name, Address)] deriving (Show)
instance Binary Contacts
    put (Contacts [(n,a)]) = do ...
    get = do ...

Mivel már vannak ilyen esetek:

instance (Binary a) => Binary [a]
instance (Binary a, Binary b) => Binary (a,b)
instance Binary Char

Egyszerűen képesnek kell lennie arra, hogy triviálisan megemelje a mögöttes eladást, és rutinokat szerezzen:

instance Binary Contacts where
    put (Contacts set) = put set
    get = fmap Contacts get

Tehát amikor névjegyeket ad meg, csak mondja meg, hogy tegye a karakterláncpárok listáját. Ha deszerializálni szeretné a névjegyeket, akkor csak megkapja a mögöttes listát, és használja a Contacts konstruktort.

10.08.2012
  • egy kis szarkazmust észlelek itt :) mindenesetre időre van szüksége a válasz dekódolásához, csak egy pillanat, biztos vagyok benne, hogy a helyes thx. 10.08.2012
  • Használnom kell a Data.Serialize-t, majd instance Serialize Contacts és nem instance Binary Contacts igaz? 10.08.2012
  • El tudod tükrözni a válaszban, hogy a Data.Binary túl alacsony szintje, és javasolja a Serialize használatát? Vagy lemaradtam a lényegről? 10.08.2012
  • Gert: Úgy szerkesztettem, hogy maradjak a Binarynál. Az Binary-nek jól kell működnie, én csak általában a Serialize-t használom (a cereal csomagból), mivel jobban megfelel az igényeimnek. 10.08.2012
  • thx egy utolsó dolog, ami zavaró számomra print [("gert","home")] működik, de print d nem, miért? 10.08.2012
  • Ha valamit dekódol, egyértelműnek kell lennie a típussal kapcsolatban (a dekódolás ByteString -> a típusú, tehát mi az a?). Használatához próbálja meg a print (d :: Contacts) karakterláncot, vagy írja be a típust a let utasításba. 10.08.2012

  • 2

    További egyszerű példák hozzáadása, hogy megakadályozzuk, hogy más noobok szenvedjenek, mint én :)

    {-# 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' = Contact{name="gert",address="home",phone="test"}
        let e' = encode c'
        print e'
        let d' = decode e'
        print (d':: Contact)
    
    10.08.2012
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..