gpt4 book ai didi

haskell - 如何用bind来定义apply?

转载 作者:行者123 更新时间:2023-12-02 13:12:22 26 4
gpt4 key购买 nike

在 Haskell 中,Applicatives 被认为比 Functor 更强,这意味着我们可以使用 Applicative 来定义 Functor,例如

-- Functor
fmap :: (a -> b) -> f a -> f b
fmap f fa = pure f <*> fa

Monad 被认为比 Applicatives 和 Functor 更强,这意味着。

-- Functor
fmap :: (a -> b) -> f a -> f b
fmap f fa = fa >>= return . f

-- Applicative
pure :: a -> f a
pure = return

(<*>) :: f (a -> b) -> f a -> f b
(<*>) = ??? -- Can we define this in terms return & bind? without using "ap"

我读到 Monad 是用于对操作进行排序的。但我觉得 Monad 唯一能做的就是 Join 或 Flatten,它的其余功能来自 Applicatives。

join :: m (m a) -> m a
-- & where is the sequencing in this part? I don't get it.

如果 Monad 真的是用于排序操作,那么我们如何定义 Applicatives(不被认为是严格按顺序操作,某种并行计算)?

由于单子(monad)是内仿函数类别中的幺半群。还有可交换幺半群,它们不一定需要按顺序工作。这意味着可交换幺半群的 Monad 实例也需要排序?

编辑:我发现了一个很棒的页面<强> http://wiki.haskell.org/What_a_Monad_is_not

最佳答案

If Monad is really for sequencing actions then How come we can define Applicatives (which are not considered to strictly operate in sequence, some kind of parallel computing)?

不完全是。所有 monad 都是 applicative,但只有一些 applicative 是 monad。因此,给定一个 monad,您始终可以根据 bind 定义一个应用实例。和return ,但是如果您拥有的只是应用实例,那么您无法在没有更多信息的情况下定义 monad。

单子(monad)的应用实例如下所示:

instance (Monad m) => Applicative m where
pure = return
f <*> v = do
f' <- f
v' <- v
return $ f' v'

当然,这会评估 fv按顺序,因为它是一个 monad,而这就是 monad 所做的事情。如果此应用程序不按顺序执行操作,那么它就不是 monad。

当然,现代 Haskell 对此进行了相反的定义:Applicative类型类是 Functor 的子集所以如果你有 Functor你可以定义 (<*>)那么你可以创建一个Applicative实例。 Monad又被定义为 Applicative 的子集,所以如果你有 Applicative实例,您可以定义 (>>=)那么你可以创建一个 Monad实例。但你不能定义(>>=)(<*>)而言.

请参阅Typeclassopedia了解更多详情。

关于haskell - 如何用bind来定义apply?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58789006/

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