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ść.
Ugh ... takie proste. Dziękuję, nie wiem, dlaczego myślałem, że to będzie bardziej skomplikowane. – clintm