У меня есть два простых типа данных в Haskell:
data Ticket = Ticket {
tbody :: String,
tauthor :: String,
tcomments :: [TicketComment]
}
data TicketComment = TicketComment {
tcbody :: String,
tcauthor :: String
}
На мгновение игнорируя отсутствие меток времени и использование строк и байтов, я просто хочу сохранить комментарии в MongoDB, вложенные в их тикеты.
До сих пор я использовал довольно простой экземпляр для хранения данных:
class MongoIO a where
transout :: a -> [Field]
transin :: [Field] -> (Maybe a)
Реализация выглядит примерно так:
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)
Как и следовало ожидать, это ломается на ("comments" =: tcomments a)
. Я уверен, что попадаю в область типов Хаскелла, где мне не хватает моих собственных знаний, поэтому я рад услышать о том, как другие подойдут к этому.