【发布时间】:2021-02-16 05:48:05
【问题描述】:
当我尝试熟悉 Haskell 中 Reader monad 的用法时,我注意到 mtl 库中提供了两个类似的函数。
asks :: MonadReader r m => (r -> a) -> m a
local :: MonadReader r m => (r -> r) -> m a -> m a
例如,
import Control.Monad.Reader
changeEnv :: String -> String
changeEnv = ("Prefix " ++)
getLength :: Reader String Int
getLength = do
e <- ask
return $ length e
runReader (local changeEnv getLength) "123"
10
runReader (asks (length . changeEnv)) "123"
10
runReader (asks (length . local changeEnv id)) "123"
10
看来我们可以使用asks 或local 来计算相同的结果。
是否存在无法从其中任何一个计算的结果?
目前,我只能说使用local 允许我将更改环境的函数(changeEnv)和返回阅读器结果的函数(getLength)分开。但是,使用asks 也可以实现同样的效果。
有什么特殊的原因我们需要它们吗?
【问题讨论】: