功能组成和绑定之间的Haskell差异

问题描述 投票:0回答:1

我无法理解Dot(功能组合)和bind(>> =)之间的区别。

如果我理解的话,这两种方法会将以前的功能结果用于新功能。

那么有什么区别?

haskell bind composition
1个回答
2
投票

它们是完全不同的。让我们看看他们的签名:

(.) :: (b -> c) -> (a -> b) -> (a -> c)
(>>=) :: (Monad m) => m a -> (a -> m b) -> m b

正如您所说,函数组合只是将一个函数的结果作为参数传递给另一个函数的方法,如下所示:

f = g . h

相当于

f x = g (h x)

您可以认为是某种“传送带”,您的价值需要经过几个处理步骤。

但是(>>=)完全不同。它与诸如monad之类的上下文相关,在某些上下文中它类似于某种值(如果您不熟悉它,则强烈建议阅读上一个链接)。

因此,使x为上下文中的某些值。我们的上下文将为可空性(Maybe monad),其值为Maybe。因此,2。例如,我们可以通过从某个关联的容器中查找得到它(这种操作可能会失败,这就是为什么它是x = Just 2而不是Maybe Int的原因。)>

现在我们想将Int传递给仅接受x并可能失败的算术函数f,因此其签名看起来像:

Int

由于类型不匹配,我们不能仅仅传递我们的值。我们可以解压缩f :: Int -> Maybe Int 并用x处理某些情况,但是我们可以用几乎所有其他语言来做到这一点。在haskell中,我们可以使用if

(>>=)

这允许链接效果:

  • 如果x >>= f x,则结果立即为Nothing
  • 其他Nothing已打开包装并传递到x
  • 这是f的概括,您可以在某些语言中看到:

operator ?.

它将在每个“步骤”处检查?.,如果命中x = a?.func1()?.func2(); 或在成功的情况下返回值,则立即停止。在haskell中,它看起来像:

null

但是,与monad绑定是一个功能更强大的概念,例如,允许您使用无像Haskell这样的可变性的语言来模拟状态计算。

© www.soinside.com 2019 - 2024. All rights reserved.