在一个实例中使用ask来获取newtype包装的Reader

时间:2016-04-07 13:24:00

标签: haskell

假设我们想要一个能够将日志字符串写入文件的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包装器,所以应该可以毫不费力地编写这个实例。或许不是吗?

1 个答案:

答案 0 :(得分:4)

由于newtype构造函数的类型是

Worker :: ReaderT Config IO a -> Worker a

我们可以将其应用于

ask :: ReaderT Config IO Config

获取

Worker ask :: Worker Config