gpt4 book ai didi

haskell - 在 Haskell 中编写嵌套的 Monad

转载 作者:行者123 更新时间:2023-12-04 14:42:41 24 4
gpt4 key购买 nike

有没有办法为嵌套的单子(monad)实现绑定(bind)?我想要的是以下签名:

(>>>=) :: (Monad m, Monad n) => m (n a) -> (a -> m (n b)) -> m (n b)

看起来这应该是一项微不足道的任务,但不知何故我就是无法理解它。在我的程序中,我将这种模式用于几种不同的 monad 组合,并且对于每种组合,我都可以实现它。但是对于一般情况,我只是不明白。

编辑:在一般情况下似乎是不可能的。但在某些特殊情况下肯定是可能的。例如。如果内部 Monad 是 Maybe。由于我想使用的所有 Monad 都是可能的,因此对我来说,有额外的约束似乎很好。所以我稍微改变一下问题:

我需要对 n 进行哪些额外的约束才能使以下内容成为可能?
(>>>=) :: (Monad m, Monad n, ?? n) => m (n a) -> (a -> m (n b)) -> m (n b)

最佳答案

扩展评论:作为linked questions显示,必须有一些功能n (m a) -> m (n a)甚至有机会将作品变成单子(monad)。

如果你的内部单子(monad)是 Traversable ,然后 sequence提供了这样的功能,以下将具有正确的类型:

(>>>=) :: (Monad m, Monad n, Traversable n) => m (n a) -> (a -> m (n b)) -> m (n b)
m >>>= k = do
a <- m
b <- sequence (map k a)
return (join b)

几个著名的转换器实际上是对等价的东西的简单新类型包装器(尽管大多使用模式匹配来定义东西,而不是字面上使用内部 monad 的 MonadTraversable 实例):
  • MaybeT 基于 Maybe
  • ExceptT 基于 Either
  • WriterT 基于 (,) ( (,) 通常没有定义它的 Monad 实例,并且 WriterT 使用错误的元组顺序来使用它,如果它有 - 但在精神上它可以有)。
  • ListT 基于 [] .哦,哎呀...

  • 事实上,最后一个因不是 monad 而臭名昭著,除非提升的 monad 是“可交换的”——否则,根据 monad 法则应该相等的表达式可以给出不同的效果顺序。我的直觉是,这主要来自能够包含多个值的列表,这与其他可靠工作的示例不同。

    所以,虽然上面的定义会被正确输入,但它仍然可以打破单子(monad)定律。

    另外作为事后的想法,另一个转换器就是这样一个嵌套的 monad,但以完全不同的方式: ReaderT ,基于使用 (->)作为外部单子(monad)。

    关于haskell - 在 Haskell 中编写嵌套的 Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33189135/

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