gpt4 book ai didi

haskell MTL : How to exit the monad and get the value within it?

转载 作者:行者123 更新时间:2023-12-03 22:16:01 24 4
gpt4 key购买 nike

我知道如何在 do block 中使用每个 monad 的函数。但是一旦完成,我该如何运行计算并获得结果?

run :: (MonadError Error m, MonadState State m) => m Int -> Int
run = ???

最佳答案

mtl 的全部要点是您无需指定具体的 monad 转换器堆栈 - 您只需指定它必须处理错误并保持状态。

但是,一旦您真正想要运行此操作,您确实需要将自己绑定(bind)到特定的 monad 转换器堆栈。该堆栈将告知您如何“运行”您的 monadic 操作。在您的情况下,您可能想要使用 ExcepT Error (State State):

action :: (MonadError Error m, MonadState State m) => m Int
action = undefined

runAction :: State -> -- initial state
Either Error Int -- account for possibility of error
runAction initialState = evalState (runExceptT action) initialState

请注意,这不是您可以做出的具体堆栈的唯一选择。事实上,您甚至可以交换 StateExcept 的顺序并选择 StateT State (Either Error) 作为您的 monad!

runAction :: State ->           -- initial state
Either Error Int -- account for possibility of error
runAction initialState = evalState action initialState

事实上,mtl 没有说明堆栈中 monad 的顺序,这是它的缺点之一(也是为什么有些人更喜欢坚持使用的原因之一变形金刚)。

关于 haskell MTL : How to exit the monad and get the value within it?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46086114/

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