gpt4 book ai didi

haskell - 绑定(bind)和连接之间有什么关系?

转载 作者:行者123 更新时间:2023-12-01 19:46:00 24 4
gpt4 key购买 nike

我的印象是 (>>=) (Haskell 使用)和 join (数学家首选)是“相等的”,因为人们可以用术语来写一个另一个:

import Control.Monad (join)

join x = x >>= id
x >>= f = join (fmap f x)

此外every monad is a functor因为 bind 可以用来替换 fmap:

fmap f x = x >>= (return . f)

我有以下问题:

  1. 是否有关于joinfmap 的(非递归)定义? (fmap f x = join $ fmap (return . f) x 由上面的方程得出,但是是递归的。)

  2. “每个 monad 都是仿函数”是使用 bind(在 monad 的定义中)时得出的结论,但在使用 join 时是一个假设吗?

  3. bindjoin 更“强大”吗? “更强大”意味着什么?

最佳答案

单子(monad)可以是 either defined in terms of :

  • return::a -> m a
  • 绑定(bind)::m a -> (a -> m b) -> m b

或者换句话说:

  • return::a -> m a
  • fmap::(a -> b) -> m a -> m b
  • join::m (m a) -> m a

对于您的问题:

  1. 不,我们不能根据 join 定义 fmap,否则我们可以从上面的第二个列表中删除 fmap
  2. 不,“每个 monad 都是仿函数”是关于一般 monad 的陈述,无论您是根据 bind 还是根据 join 定义特定的 monad和fmap。如果您看到第二个定义,就更容易理解该语句,但仅此而已。
  3. 是的,bindjoin 更“强大”。它与 joinfmap 的组合一样“强大”,如果你的意思是“强大”,它有能力定义一个 monad(总是与 结合使用) >返回)。

对于直觉,请参见例如this answerbind 允许您将策略/计划/计算(在上下文中)组合或链接在一起。作为示例,让我们使用 Maybe 上下文(或 Maybe monad):

λ: let plusOne x = Just (x + 1)
λ: Just 3 >>= plusOne
Just 4

fmap 还允许您将上下文中的计算链接在一起,但代价是每一步都会增加嵌套。[1]

λ: fmap plusOne (Just 3)
Just (Just 4)

这就是为什么您需要 join: 将两层嵌套压缩为一层。请记住:

join :: m (m a) -> m a

只有挤压步骤并不能让你走得太远。您还需要 fmap 来拥有一个 monad – 和 return,即上面示例中的 Just

[1]: fmap(>>=) 不以相同的顺序获取它们的两个参数,但不要让这让您感到困惑。

关于haskell - 绑定(bind)和连接之间有什么关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56391291/

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