2010-12-10 13 views
7

Haskell'de iki basit veri türüm var:MongoDB iç içe geçmiş verilerle Haskell türlerini kullanmanın doğru yolu nedir?

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

Zaman damgası yokluğu ve dizgilerle bytestrings kullanımı bir an için göz ardı edersek, yalnızca MongoDB'deki yorumları biletlerinde saklamak istiyorum.

Şimdiye kadar veri depolamak için oldukça basit bir örnek kullanıyorum:

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

Uygulama daha sonra şöyle görünüyor:

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) 

Beklendiği gibi, bu durum ("comments" =: tcomments a). Kendi bilgimin eksik olduğu bir Haskell türü alanına girdiğimden eminim, bu yüzden başkalarının buna nasıl yaklaşacağını duymak beni heyecanlandırıyor.

cevap

8

Gömülü belgeleri de çevirmeniz gerekiyor.

artı TicketComment için benzer örnek.

[Field] için Document eşanlamlı türünü de kullanırdım.

+0

Ugh ... çok basit. Teşekkür ederim, neden bundan daha karmaşık olacağını düşündüğümden emin değilim. – clintm

2

Örneğinizde tersine döndürülen transin ve transout uygulamalarına sahip olduğunuz görülüyor. Sizin transin, bir Ticket alır ve Field s bir listesini döndürür; ama bu transout 'tür.

+0

Oh, hey, haklısınız. Şimdi tamir ediyorum. Teşekkürler! – clintm