gpt4 book ai didi

haskell - applicative functor 和 monad 的等价

转载 作者:行者123 更新时间:2023-12-01 06:55:16 27 4
gpt4 key购买 nike

人们说 monad 是应用仿函数的扩展,但我不这么认为。让我们举一个应用仿函数的例子:(<*>) :: f(a->b) -> f a -> f b

[(+3)] <*> [2,3,4]

现在,我也希望我可以做与 monad 相同的事情,这意味着我可以应用 2 个参数:一个上下文包含一个函数,另一个上下文来获取一个上下文。但是对于 monad,我不能。我所需要的只是编写一个像这样的丑陋函数:
[2,3,4] >>= (\x->[x+3])

是的,当然,你可以说 [(+3)]相当于 [\x->(x+3)] .但至少,这个功能是在上下文中的。

最后,我在这里没有看到等效或扩展。 Monad 是一种不同的风格,在另一个故事中很有用。

抱歉我的无知。

最佳答案

TMonad 的一个实例,那么你可以让它成为 Applicative 的一个实例像这样:

instance Functor T where
fmap = liftM

instance Applicative T where
pure = return
(<*>) = ap
liftM被定义为
liftM   :: (Monad m) => (a1 -> r) -> m a1 -> m r
liftM f m1 = do { x1 <- m1; return (f x1) }
ap被定义为
ap                :: (Monad m) => m (a -> b) -> m a -> m b
ap = liftM2 id

liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }

因此,“monad 是 applicative functors 的扩展”,意思是任何 monad 都可以变成 applicative functor。事实上,它被广泛地(并非普遍地)认为是标准库中的一个错误,类 Monad不是从类 Applicative 派生的.

关于haskell - applicative functor 和 monad 的等价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13533769/

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