Veritabanına çok sayıda erişime sahip bir Happstack uygulaması oluşturmak istiyorum.Happstack'ta bir veritabanı Monad Stack nasıl oluşturulur?
itemsRequest :: ServerConfig -> ServerPart Response
itemsRequest cf = dir "items" $ do
methodM [GET,HEAD]
liftIO $ noticeM (scLogger cf) "sended job list"
items <- runDBMonad (scDBConnString cf) $ getItemLists
case items of
(Right xs) -> ok $ toResponse $ show xs
(Left err) -> internalServerError $ toResponse $ show err
olarak: Ben alt ve (ortada günlük yazar ile) üstüne bir veritabanı Yaz benzeri monad de IO ile Monad Stack her erişim, örneğin açık bir işlevi vardır için çalışacağını düşünüyorum:
getItemList :: MyDBMonad (Error [Item])
getItemList = do
-- etc...
Ama Monad ve Monad Transformers (Bu konuda bilgi edinmek için bir egzersiz olarak bu soruya bakın) çok az bilgiye sahip ve ben nasıl nasıl IO kaldırmaya, Veritabanı Monad oluşturulmasını başlamak için hiçbir fikrim yok happstack'tan Database Stack'a ... vb. Bu durumda, herkesin de almak istiyorum değer veritabanı bağlantısı -
type MyMonad a = ReaderT DbHandle ServerPart a
Reader
monad trafo ask
işlevini kullanarak erişilebilir tek bir değeri yapar:
İçinde IO yapmak için 'unsafePerformIO' kullanmayı denedim. Happstack tamamen bir kombinasyon kullandığından, belki de IO'yu yapmanın tek yoludur. – Nybble
@Wu Xingbo, elevio'nun elevio'yu liftIO ile yapmak mümkün, ancak başka bir monad kümesine kimin geçeceğini bilmiyorum. – Zhen