gpt4 book ai didi

haskell - 为什么 runXXX 不是 MonadTrans 定义的一部分?

转载 作者:行者123 更新时间:2023-12-04 21:57:14 27 4
gpt4 key购买 nike

MonadTrans文件说:

Each monad transformer also comes with an operation runXXX to unwrap the transformer, exposing a computation of the inner monad.



所以我想知道为什么 MonadTrans未定义为
class MonadTrans t where
type p :: *
type r :: * -> *
lift:: Monad m => m a -> t m a
run :: t m a -> p -> m (r a)

消除上述条款?上面的定义不够通用吗?如果是这样,哪个单子(monad)变压器不适合这个定义?

更新

稍作调整以启用不同的结果类型。

最佳答案

没有用于运行 monad 转换器的通用接口(interface)。例如,尝试运行 LogicTContTFreeT使用您的界面。

即使您可以概括您的界面来处理所有这些示例,您仍然会缺少关键要素:法律。类型类方法应该遵循允许您推理使用类型类接口(interface)的代码而无需咨询特定实例的来源的等式。例如,lift来自 MonadTrans 的方法必须遵守这些法律:

lift (return x) = return x

lift (m >>= f) = lift m >>= \x -> lift (f x)
lift 有很好的理论原因应该遵守这些法则,如果你以这种无点风格编写法则,这些法则会变得更加明显:
(lift .) return = return                        -- fmap id = id

(lift .) (f >=> g) = (lift .) f >=> (lift .) g -- fmap (f . g) = fmap f . fmap g

换句话说, (lift .)是两个 kleisli 类别和 lift 之间的仿函数因此是一个单子(monad)态射。

定义类型类如 Functor , Monad , 和 MonadTrans ,以及 Typeclassopedia是开始了解有关此主题的更多信息的好地方。

关于haskell - 为什么 runXXX 不是 MonadTrans 定义的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24749415/

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