Reader monad - reader vs 问函数区别?
Reader monad - reader vs asks function difference?
reader monad有一个asks函数,其定义与reader函数完全相同,为什么它作为一个单独的函数存在,其定义与 reader?为什么不总是使用 reader?
class Monad m => MonadReader r m | m -> r where
-- | Retrieves the monad environment.
ask :: m r
ask = reader id
-- | Executes a computation in a modified environment.
local :: (r -> r) -- ^ The function to modify the environment.
-> m a -- ^ @Reader@ to run in the modified environment.
-> m a
-- | Retrieves a function of the current environment.
reader :: (r -> a) -- ^ The selector function to apply to the environment.
-> m a
reader f = do
r <- ask
return (f r)
-- | Retrieves a function of the current environment.
asks :: MonadReader r m
=> (r -> a) -- ^ The selector function to apply to the environment.
-> m a
asks = reader
我找到了将这种冗余引入 transformers package and the mtl 包的补丁。 patch/commit 的描述……不是很有启发性。但是,在这两种情况下,asks
都早于 reader
,并且在这两种情况下,相同的更改都引入了 state
和 writer
原语。
所以,一些猜测:
- 据观察,将 transformer/monad class 的核心语义作为库中表示的概念是很方便的。
- 为了可预测性,新基元以提供该基元的转换器命名,仅此而已(
StateT
-> state
;WriterT
-> writer
; ReaderT
-> reader
)。这 parallelism 让用户更容易记住他们想要的东西叫什么。
- 由于
asks
已经存在,它被保留下来以实现一定程度的向后兼容性。
如果我们想要一个明确的答案,我们可能不得不询问 Ed Kmett 或 Twan van Laarhoven,他们是这些变化的明显发起者。
reader monad有一个asks函数,其定义与reader函数完全相同,为什么它作为一个单独的函数存在,其定义与 reader?为什么不总是使用 reader?
class Monad m => MonadReader r m | m -> r where
-- | Retrieves the monad environment.
ask :: m r
ask = reader id
-- | Executes a computation in a modified environment.
local :: (r -> r) -- ^ The function to modify the environment.
-> m a -- ^ @Reader@ to run in the modified environment.
-> m a
-- | Retrieves a function of the current environment.
reader :: (r -> a) -- ^ The selector function to apply to the environment.
-> m a
reader f = do
r <- ask
return (f r)
-- | Retrieves a function of the current environment.
asks :: MonadReader r m
=> (r -> a) -- ^ The selector function to apply to the environment.
-> m a
asks = reader
我找到了将这种冗余引入 transformers package and the mtl 包的补丁。 patch/commit 的描述……不是很有启发性。但是,在这两种情况下,asks
都早于 reader
,并且在这两种情况下,相同的更改都引入了 state
和 writer
原语。
所以,一些猜测:
- 据观察,将 transformer/monad class 的核心语义作为库中表示的概念是很方便的。
- 为了可预测性,新基元以提供该基元的转换器命名,仅此而已(
StateT
->state
;WriterT
->writer
;ReaderT
->reader
)。这 parallelism 让用户更容易记住他们想要的东西叫什么。 - 由于
asks
已经存在,它被保留下来以实现一定程度的向后兼容性。
如果我们想要一个明确的答案,我们可能不得不询问 Ed Kmett 或 Twan van Laarhoven,他们是这些变化的明显发起者。