如何将 Control.Monad.Reader 的 mapReader 用于 reader monad?
How to use mapReader from Control.Monad.Reader for reader monad?
我正在尝试找出如何使用 Control.Monad.Reader
中的 mapReader
。
例如我有这个 reader monad
myReaderMonad :: Reader String Int
myReaderMonad = do
string <- ask
return (length string)
我可以运行这样
>>> runReader myReaderMonad "Saurabh"
>>> 7
现在我正在尝试检查 运行Reader 返回的值是否为偶数。
不使用 mapReader
我可以这样做
>>> even $ runReader myReaderMonad "Saurabh"
>>> False
但是我想用 mapReader
https://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
不是 return 可以将 "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
我正在尝试找出如何使用 Control.Monad.Reader
中的 mapReader
。
例如我有这个 reader monad
myReaderMonad :: Reader String Int
myReaderMonad = do
string <- ask
return (length string)
我可以运行这样
>>> runReader myReaderMonad "Saurabh"
>>> 7
现在我正在尝试检查 运行Reader 返回的值是否为偶数。
不使用 mapReader
我可以这样做
>>> even $ runReader myReaderMonad "Saurabh"
>>> False
但是我想用 mapReader
https://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
不是 return 可以将 "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