【发布时间】:2015-12-27 15:57:50
【问题描述】:
所以我被告知 (->) r 是 Reader monad 的一个实例,但我似乎找不到任何具体的例子来说明它应该如何工作。我想使用它而不必在阅读器中显式包装我的一些代码
import Control.Monad.Reader
testOne :: Reader String String
testOne = do
env <- ask
return $ "Hello, " ++ env
testTwo :: String -> String
testTwo = do
env <- ask
return $ "G'day, " ++ env
运行runReader testOne "there" 工作正常,但运行runReader testTwo "mate" 失败并显示以下消息:
Couldn't match type ‘String -> String’
with ‘ReaderT [Char] Data.Functor.Identity.Identity a’
Expected type: Reader [Char] a
Actual type: String -> String
那么我在这里错过了什么?
【问题讨论】:
-
为什么你想要
runReader testTwo "mate"成为生成任何东西的有效语法,不同于id testTwo "mate"?请注意,(->) r不是“Reader monad 的实例”,而是“与 Reader monad 做同样事情的 monad”。但是为了帮助您,我们需要知道:您是否正在与将Reader r x作为参数的东西进行交互?或者您是否需要多态代码并且都接受Reader r x和r -> x函数?还是什么? -
@CRDrost 这更像是一个“如果我有同时使用这两种东西的东西”的问题,拥有一个统一的跑步者会很有用。但我想既然整个问题都是由误导性陈述引导的,我真的不需要它吗?
标签: haskell monads reader-monad