gpt4 book ai didi

haskell - Reader monad - reader vs asks 功能区别?

转载 作者:行者123 更新时间:2023-12-03 23:41:22 28 4
gpt4 key购买 nike

reader monad 有一个asks 函数,它的定义与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 的补丁包和 mtl包裹。补丁/提交描述......不是很有启发性。然而,在这两种情况下,asks 早于 reader,并且在这两种情况下,相同的更改引入了 statewriter 原语。

所以,一些猜测:

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

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

关于haskell - Reader monad - reader vs asks 功能区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65511596/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com