我很难理解Reader Monad。我从所有读过的地方的理解是,它允许共享变量(读取模式)到不同的功能。下面是两个函数计算和相同的实现(对不好的函数名称),一个用Reader,一个没有它。我没有使用Reader获得好处。
module Moreunderstanding where
import Control.Monad.Reader
computation :: Reader Int Int
computation = do
a <- ask
b <- asks square
return (a + b)
square :: Int -> Int
square x = x ^ 2
samething:: Int -> Int
samething = do
a <- square
b <- id
return (a + b)
我不确定我在这里失踪的是什么。
答案 0 :(得分:3)
这些都做同样的事情。事实上,Reader monad与函数monad(你在INSERT INTO Opex_Accounts
(Opex_Id
, Opex_Name
, Gl_Account
)
VALUES(-1
,'UNKNOWN'
,'UNKNOWN'
);
ALTER TABLE Opex_Spend ADD CONSTRAINT [DF_Opex_Spend_Opex_Id] DEFAULT (-1) FOR Opex_Id;
中使用)非常相似。它变得有用,因为samething
类型类(MonadReader
有一个实例)和(->) a
,它允许你将多个monad变换器堆叠在一起。
这也是一个很好的意图陈述。这意味着“我在这里有一个只读值,将用于此计算”。我会说你的直觉非常准确,但读者monad并不多,这很简单。
答案 1 :(得分:2)
当你有几个必须从函数传递给函数的参数时,Reader monad会变得更有用。例如,如果您正在构建一些API端点,并且想要传递配置对象。在这种情况下,使用Reader monad更容易,并保持内部函数签名清洁。