gpt4 book ai didi

haskell - 为 Monad 实现 Applicative (<*>)

转载 作者:行者123 更新时间:2023-12-03 12:29:12 28 4
gpt4 key购买 nike

Applicative的有 (<*>)功能:

(<*>) :: (Applicative f) => f (a -> b) -> f a -> f b

Learn You a Haskell显示以下功能。

鉴于:
ap :: (Monad m) => m (a -> b) -> m a -> m b  
ap f m = do
g <- f -- '<-' extracts f's (a -> b) from m (a -> b)
m2 <- m -- '<-' extracts a from m a
return (g m2) -- g m2 has type `b` and return makes it a Monad

怎么可能 ap写成 bind单独,即 >>= ?

我不知道如何提取 (a -> b)来自 m (a -> b) .也许一旦我明白如何 <-工作于 do notation ,我会理解我上述问题的答案。

最佳答案

How could ap be written with bind alone, i.e. >>= ?



这是我可以想出的一个示例实现:
ap :: (Monad m) => m (a -> b) -> m a -> m b
ap xs a = xs >>= (\f -> liftM f a)

如果你甚至不想使用 liftM然后:
ap :: (Monad m) => m (a -> b) -> m a -> m b
ap mf ma = mf >>= (\f -> ma >>= (\a' -> return $ f a'))

这些是最初的类型:
mf  :: m (a -> b)
ma :: m a

现在,当您将 bind ( >>= ) 运算符应用于 mf 时: mf >>= (\f-> ... ,然后 f具有以下类型:
f :: (a -> b)

下一步, ma也适用于 >>= : ma >>= (\a'-> ... ,这里 a'具有以下类型:
a' :: a

所以,现在当你申请时 f a' ,您将获得类型 b从那是因为:
f    :: (a -> b)
a' :: a
f a' :: b

你申请 returnf a'它将用 monadic 层包裹它,因此你得到的最终类型将是:
return (f a') :: m b

因此,一切都进行了类型检查。

关于haskell - 为 Monad 实现 Applicative (<*>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25473033/

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