gpt4 book ai didi

haskell - 使用 monad,可以用 bind 来定义 join 吗?

转载 作者:行者123 更新时间:2023-12-02 01:53:04 29 4
gpt4 key购买 nike

在 Haskell 中,monad 是根据函数 return 和 bind 定义的,其中 return 的类型为 a -> m a。 bind 的类型为 m a -> (a -> m b) -> m b .之前已经指出monads can also be defined in terms of return and join , 其中 join 是类型为 m (m a) -> m a 的函数.绑定(bind)可以根据连接来定义,但是反过来可能吗?可以根据绑定(bind)来定义连接吗?

如果没有加入,我不知道如果我以某种方式获得了“两次包装”的单子(monad)值,我会怎么做,m (m a) - 可以这么说,没有一个仿函数或单子(monad)操作“删除任何层”。如果这是不可能的,为什么 Haskell 和许多其他 monad 实现用绑定(bind)来定义它们?严格来说,它似乎不如基于连接的定义有用。

最佳答案

有可能的:

join :: Monad m => m (m a) -> m a
join m = (m >>= id)

注意 >>= 的棘手实例化:
(>>=) :: m b -> (b -> m c) -> m c
-- choosing b ~ m a , c ~ a
(>>=) :: m (m a) -> (m a -> m a) -> m a

所以我们可以正确选择 id对于第二个论点。

关于haskell - 使用 monad,可以用 bind 来定义 join 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34398239/

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