gpt4 book ai didi

haskell - 转换单子(monad)

转载 作者:行者123 更新时间:2023-12-02 13:14:27 26 4
gpt4 key购买 nike

假设我有功能

(>>*=) :: (Show e') => Either e' a -> (a -> Either e b) -> Either e b

它正在将不同类型的错误转换为干净的简化函数。我对此感到非常高兴。

但是

可能有函数<*-可以做类似的工作,而不是 <-关键字,它看起来不会太令人不安?

最佳答案

嗯,我的答案实际上与 Toxaris 对 foo::Either e a -> Either e' a 函数的建议相同,但我会尝试更多地激发它。

foo 这样的函数我们称之为 monad morphism :从一种单子(monad)到另一种单子(monad)的自然转变。您可以非正式地将其视为将源 monad 中的任何操作(无论结果类型如何)发送到目标 monad 中的“合理”对应项的函数。 (“明智”的部分是它变得数学的地方,所以我将跳过这些细节......)

Monad 态射是比您建议的用于处理 Haskell 中此类情况的 >>*= 函数更基本的概念。如果您的 >>*= 相当于以下内容,则表现良好:

(>>*=) :: Monad m => n a -> (a -> m b) -> m b
na >>*= k = morph na >>= k
where
-- Must be a monad morphism:
morph :: n a -> m a
morph = ...

因此,最好将 >>*= 分解为 >>= 和特定于案例的单子(monad)态射。如果您阅读上面的链接,并且 the tutorial for the mmorph library ,您将看到通用实用函数的示例,这些函数使用用户提供的单子(monad)态射来“编辑”单子(monad)更改器(mutator)堆栈 - 例如,使用单子(monad)态射 morph::Error e a -> Error e' aStateT s (ErrorT e IO) a 转换为 StateT s (ErrorT e' IO) a

关于haskell - 转换单子(monad),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21714826/

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