Haskell Language
Reader / ReaderT
Поиск…
Вступление
Reader предоставляет функциональность для передачи значения по каждой функции. Полезный справочник с некоторыми диаграммами можно найти здесь: http://adit.io/posts/2013-06-10-three-useful-monads.html
Простая демонстрация
Ключевой частью монады-читателя является функция ask
( https://hackage.haskell.org/package/mtl-2.2.1/docs/Control-Monad-Reader.html#v:ask) , которая определена для иллюстративных цели:
import Control.Monad.Trans.Reader hiding (ask)
import Control.Monad.Trans
ask :: Monad m => ReaderT r m r
ask = reader id
main :: IO ()
main = do
let f = (runReaderT $ readerExample) :: Integer -> IO String
x <- f 100
print x
--
let fIO = (runReaderT $ readerExampleIO) :: Integer -> IO String
y <- fIO 200
print y
readerExample :: ReaderT Integer IO String
readerExample = do
x <- ask
return $ "The value is: " ++ show x
liftAnnotated :: IO a -> ReaderT Integer IO a
liftAnnotated = lift
readerExampleIO :: ReaderT Integer IO String
readerExampleIO = do
x <- reader id
lift $ print "Hello from within"
liftAnnotated $ print "Hello from within..."
return $ "The value is: " ++ show x
Вышеприведенное будет распечатываться:
"The value is: 100"
"Hello from within"
"Hello from within..."
"The value is: 200"
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow