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,并且在这两种情况下,相同的更改都引入了 statewriter 原语。

所以,一些猜测:

  1. 据观察,将 transformer/monad class 的核心语义作为库中表示的概念是很方便的。
  2. 为了可预测性,新基元以提供该基元的转换器命名,仅此而已(StateT -> stateWriterT -> writerReaderT -> reader)。这 parallelism 让用户更容易记住他们想要的东西叫什么。
  3. 由于 asks 已经存在,它被保留下来以实现一定程度的向后兼容性。

如果我们想要一个明确的答案,我们可能不得不询问 Ed Kmett 或 Twan van Laarhoven,他们是这些变化的明显发起者。