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?
almak için
üzerine uygulayabilirsiniz? GeneralizedNewtypeDeriving'e ihtiyacınız var, ama bence MonadIO için zaten var. Ve Import Control.Monad.Reader – Michael
İyi nokta. Yine de, bu durumda el ile nasıl yazılacağını bilmek istedim. Çok kolay olmalı ama bir şekilde kayboldu. – user2847643