【发布时间】:2016-03-08 09:55:32
【问题描述】:
我正在研究 monad 转换器,我阅读了 this SO 帖子,了解如何避免 lifts。
我的想法是MonadIO 是可以嵌入IO 的单子,而MonadWriter w 是可以嵌入WriterT w 的单子。所以我写了下面的代码(读取、累积和记录数字,直到我们得到零),其中使用显式 lift 的工作版本在 cmets 中。但 GHC 抱怨。我做错了什么?
{-# LANGUAGE FlexibleContexts #-}
import Control.Monad.IO.Class
import Control.Monad.Writer.Class (MonadWriter)
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Writer
-- f :: ReaderT Int (WriterT [String] IO) Int
-- m1 = ReaderT, m2 = WriterT
f :: (MonadWriter [String] m1, MonadIO m2) => m1 (m2 (IO Int))
f = do
s <- liftIO getLine
tell ["Input: " ++ s] -- lift $ tell ["Input: " ++ s]
let i = read s :: Int
if i == 0
then ask
else local (+i) f
main = do
rst <- runWriterT $ runReaderT f 0
print rst
【问题讨论】:
-
GHC 怎么投诉? (总是添加错误信息)
标签: haskell functional-programming monads monad-transformers