假设我们想要一个能够将日志字符串写入文件的Worker
monad。日志文件路径是通过Config
提供的工作人员ReaderT
的一部分:
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 ()
这在很多方面当然不是最理想的。我想问的问题是如何最好地定义:
instance HasLogging Worker where
log s = do
...
我无法解决的问题是如何调用ask
来获取配置。 Worker
本身不会公开ask
。但是,因为它只是一个newtype包装器,所以应该可以毫不费力地编写这个实例。或许不是吗?
答案 0 :(得分:4)
由于newtype构造函数的类型是
Worker :: ReaderT Config IO a -> Worker a
我们可以将其应用于
ask :: ReaderT Config IO Config
获取
Worker ask :: Worker Config