簡體   English   中英

如何將 Control.Monad.Reader 中的 mapReader 用於 reader monad?

[英]How to use mapReader from Control.Monad.Reader for reader monad?

我試圖弄清楚如何使用Control.Monad.Reader中的mapReader

例如我有這個讀者單子

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

我可以這樣運行

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

現在我正在嘗試檢查 runReader 返回的值是否偶數。 不使用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計算轉換為普通的 function,它只是將其轉換為另一個Reader計算。

表達式mapReader even myReaderMonad都不會返回 function 您可以將“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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM