2010-12-10 8 views
7

Mam dwie proste typy danych w Haskell:Jaki jest "właściwy sposób" używania typów Haskell z zagnieżdżonymi danymi MongoDB?

data Ticket = Ticket { 
    tbody :: String, 
    tauthor :: String, 
    tcomments :: [TicketComment] 
} 
data TicketComment = TicketComment { 
    tcbody :: String, 
    tcauthor :: String 
} 

Ignorowanie na chwilę brak znaczników czasu i korzystania z ciągów vs. bytestrings, ja po prostu chcesz zapisać komentarze w MongoDB zagnieżdżone w swoich biletów.

Do tej pory używam dość prosty wystąpienie do przechowywania danych:

class MongoIO a where 
    transout :: a -> [Field] 
    transin :: [Field] -> (Maybe a) 

Realizacja wtedy wyglądać tak:

instance MongoIO Ticket where 
    transout a = [("body" =: tbody a), 
       ("author" =: tauthor a), 
       ("comments" =: tcomments a)] 
    transin a = case (,,) <$> look "body" a 
         <*> look "author" a 
         <*> look "comments" a of 
       Nothing -> Nothing 
       Just (bo,au,co) -> 
        Just $ Ticket (typed bo) (typed au) (typed co) 

Jak można było oczekiwać, to rozkłada się ("comments" =: tcomments a). Jestem pewien, że dostaję się do obszaru typu Haskell, gdzie brakuje mojej wiedzy, więc jestem podekscytowany faktem, że inni będą do tego podejść.

Odpowiedz

8

Należy również tłumaczyć dokumenty wbudowane. Tak więc

plus podobne wystąpienie dla TicketComment.

Również chciałbym użyć typu synonim Document dla [Field].

+0

Ugh ... takie proste. Dziękuję, nie wiem, dlaczego myślałem, że to będzie bardziej skomplikowane. – clintm

2

Wygląda na to, że masz po prostu odwrócone implementacje transin i transout. Twój transin pobiera Ticket i zwraca listę Field s; ale to jest typ transout.

+0

Och, hej, masz rację. Napraw to teraz. Dzięki! – clintm

Powiązane problemy