读者Monad的目的

时间:2017-03-23 16:52:47

标签: haskell monads

我很难理解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)

我不确定我在这里失踪的是什么。

2 个答案:

答案 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更容易,并保持内部函数签名清洁。