如何使用控件中的mapReader.莫纳德.读者莫纳德的读者



我正试图弄清楚如何从Control.Monad.Reader使用mapReader

例如,我有一个阅读器monad

myReaderMonad :: Reader String Int
myReaderMonad = do
string <- ask
return (length string)

我可以像这个一样运行它

>>> runReader myReaderMonad  "Saurabh"
>>> 7

现在我正在尝试检查runReader返回的值是否为偶数。不使用mapReader,我可以像这个一样

>>> even $ runReader myReaderMonad  "Saurabh"
>>> False

但我想使用mapReaderhttps://hackage.haskell.org/package/mtl-2.2.2/docs/Control-Monad-Reader.html#v:mapReader

我尝试了以下操作,但不起作用。

>>> mapReader even  myReaderMonad  "Saurabh"
>>> • Couldn't match expected type ‘[Char] -> t’
with actual type ‘ReaderT
String Data.Functor.Identity.Identity Bool’
• The function ‘mapReader’ is applied to three arguments,
but its type ‘(Int -> Bool)
-> Reader String Int
-> ReaderT String Data.Functor.Identity.Identity Bool’
has only two
In the expression: mapReader even myReaderMonad "Saurabh"
In an equation for ‘it’:
it = mapReader even myReaderMonad "Saurabh"

请帮我一下。

mapReader不会突然将Reader-计算变成一个普通函数,它只是将其变成另一个Reader-计算。

表达式mapReader even myReaderMonad不返回可以将"Saurabh"作为参数提供给它的函数。相反,它会给你一个Reader String Bool

现在您有了这个新的Reader String Bool值,您可以使用runReader给它一个字符串,并获得一个结果:

> myEvenReader = mapReader even myReaderMonad
...
> runReader myEvenReader "Saurabh"
False

或者你可以用其他方式使用它,例如通过另一个mapReader:

> myOddReader = mapReader not myEvenReader
...
> runReader myOddReader "Saurabh"
True

相关内容

  • 没有找到相关文章

最新更新