2016-04-07 19 views
0

Workerのモナドにファイルにログ文字列を書き込む機能があるとします。ログファイルのパスはReaderTを通じて利用できる労働者Configの一部です:newtypeラップされたReaderのインスタンスで尋ねる

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を公開していません。しかし、これは単なるニュータイプのラッパーなので、このインスタンスをあまり騒がすことなく書くことが可能でなければなりません。またはそうでないかもしれません?

+2

を取得するために

ask :: ReaderT Config IO Config 

にそれを適用することができますか?あなたはGeneralizedNewtypeDerivingが必要ですが、あなたは既にMonadIOのためにそれを持っていると思います。そして輸入Control.Monad.Reader – Michael

+0

良い点。この場合、私は手で書き込む方法を知りたがっていました。それは簡単だと分かっていたが、何とか迷ってしまった。 – user2847643

答えて

4

のnewtypeコンストラクタのタイプは

Worker :: ReaderT Config IO a -> Worker a 

あるので、我々は派生もののリストにMonadReaderを追加しないのはなぜ

Worker ask :: Worker Config 
関連する問題