【问题标题】:How do I run this method with MonadReader and MonadIO?如何使用 MonadReader 和 MonadIO 运行此方法?
【发布时间】:2020-01-13 14:56:28
【问题描述】:

我正在关注 this post 关于 Haskell 中的 reader monad。

从定义开始:

load :: Config -> String -> IO String
load config x -> readFile (config ++ x)

其中 Config 是 String 的类型别名,它代表一个目录名。

该方法旨在在屏幕上显示文件的内容,例如“./myFile.txt”。

我从 ghci 运行这个方法:

load "./" "myFile.txt"

第二个例子介绍了 reader monad:

load :: (MonadReader Config m, MonadIO m) => String -> m String
load x = do
    config <- ask
    liftIO $ readFile (config ++ x)

问题是:如何从 ghci 运行它

我尝试过类似的东西:

(runReader load "myFile.txt") "./"

但没有快乐。

加载 ./myFile.txt 的命令是什么?

【问题讨论】:

  • 您遇到的具体问题是什么? “不高兴”不是错误陈述。
  • 尝试将(runReader 更改为runReader (

标签: haskell monads reader-monad


【解决方案1】:
runReaderT (load "myFile.txt") "./" :: IO String

【讨论】:

  • 你是王子。谢谢!您能否进一步扩展为什么我需要运行变压器?我想在类型 m 中隐藏了一些 monad 分层,但我还看不到它。
  • @MarcoFaustinelli 作为第一个近似值,MonadReader Config m 约束表示m 是一个monad 转换器堆栈,其中包含堆栈中某处的ReaderT ConfigMonadIO m 约束表示堆栈底部的 monad 是 IO。所以ReaderT Config IO在某种意义上是一种满足约束的“最小”的monad转换器栈。
  • 我不熟悉命名转换器without the T at the end;但是如果我查看hackage,我看不到任何适合此处使用的 MonadReader 实例。我错过了什么?
  • @MarcoFaustinelli instance Monad m =&gt; MonadReader r (ReaderT r m),您提供的第二个链接中实例列表底部的第四个,是此处使用的实例。
猜你喜欢
  • 2020-10-03
  • 2015-05-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多