gpt4 book ai didi

haskell - 如果其中一个 monad 包装在 monad 转换器内,是否可以重用 monad 组合函数?

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

假设我有一个由两个 monad 操作组成的函数:

co::Monad m => m a -> m a -> m a

您可以将 co 视为一个高阶函数,它描述两个单子(monad)操作如何相互协作来完成任务。

但现在我发现第一个单子(monad) Action 可能包含在单子(monad)变压器内,而第二个则不是:

one::(MonadTrans t, Monad m) => t m a

two::Monad m => m a

但仍然想将它们组合在一起,所以我需要一个函数:

co'::(MonadTrans t, Monad m) => t m a -> m a -> t m a

这样第一个 t m a 就可以通过将所有 m 原语提升到上下文 t 来与 m a 合作.

这里的技巧是在不真正了解 mt 的实现的情况下构建 co。我觉得答案就在 MFunctor 包中的某个地方,事实上昨天也问过类似的问题。但想不出什么好的办法,有什么想法吗?

最佳答案

您可以使用 mmorph 包中的 hoist 来完成此操作。 hoist 允许您修改任何实现 MFunctor 的基本 monad(这是大多数 monad 转换器):

hoist :: (MFunctor t) => (forall x . m x -> n x) -> t m r -> t n r

然后您可以像这样使用它来解决您的问题:

co' tma ma = hoist (co ma) tma

那么你就完成了!

要了解其工作原理,让我们逐步了解这些类型:

co :: (Monad m) => m a -> m a -> m a

ma :: (Monad m) => m a

co ma :: (Monad m) => m a -> m a

hoist (co ma) :: (Monad m, MFunctor t) => t m a -> t m a

tma :: (Monad m, MFunctor t) => t m a

hoist (co ma) tma :: (Monad m, MFunctor t) => t m a

请注意,hoist 必须满足某些法律,以确保它做您期望的“正确的事情”:

hoist id = id

hoist (f . g) = hoist f . hoist g

这些只是仿函数法则,保证了 hoist 的行为直观。

hoistmmorph 包的 Control.Monad.Morph 模块中提供,您可以在 here 中找到该模块。 。主模块底部有a tutorial教学如何使用该包

关于haskell - 如果其中一个 monad 包装在 monad 转换器内,是否可以重用 monad 组合函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18388563/

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