2016-04-07 13 views
0

Bir dosyaya günlük dizeleri yazabilme yeteneğine sahip bir Worker monad'ımız olmasını istiyoruz. Günlük dosyası yolu ReaderT aracılığıyla işçinin mevcut Config parçasıdır:Newtype ile sarılmış Reader için bir örnekte soru sorma

data Config = Config { logFile :: FilePath } 

newtype Worker a = Worker { runWorker :: ReaderT Config IO a } 
    deriving (Functor, Applicative, Monad, MonadIO) 

class (Monad m, MonadIO m) => HasLogging m where 
    log :: String -> m() 

Bu elbette birçok yönden suboptimaldir.

instance HasLogging Worker where 
    log s = do 
    ... 

şey etrafında başımı sarmak yapılandırma almak için ask çağırmak nasıl edemez: Ben sormak istiyorum soru en iyi nasıl tanımlanacağını olduğunu. Worker'un kendisi ask'u göstermez. Ancak, sadece bir yeni tip sarıcı olduğundan, bu örneği çok fazla yaygaralamadan yazmak mümkün olmalıdır. Ya da belki değil?

+2

almak için

ask :: ReaderT Config IO Config 

üzerine uygulayabilirsiniz? GeneralizedNewtypeDeriving'e ihtiyacınız var, ama bence MonadIO için zaten var. Ve Import Control.Monad.Reader – Michael

+0

İyi nokta. Yine de, bu durumda el ile nasıl yazılacağını bilmek istedim. Çok kolay olmalı ama bir şekilde kayboldu. – user2847643

cevap

4

newtype yapıcı tipi

Worker :: ReaderT Config IO a -> Worker a 

olduğundan biz şeylerin listesine MonadReader eklemek türetilmiş olup Neden

Worker ask :: Worker Config