gpt4 book ai didi

haskell - 从应用 (<*>) 混淆中派生 monad 绑定(bind)

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

在读完 Haskell Book 后,我的大脑突然想到了下面的例子。我真不知道什么是flip函数在第 21 行执行

1 class Functor f where
2 fmap :: (a -> b) -> f a -> f b
3
4 class Functor f => Applicative f where
5 pure :: a -> f a
6 (<*>) :: f (a -> b) -> f a -> f b
7
8 class Applicative f => Monad f where
9 return :: a -> f a
10 (>>=) :: f a -> (a -> f b) -> f b
11
12 instance Functor ((->) r) where
13 fmap = (.)
14
15 instance Applicative ((->) r) where
16 pure = const
17 f <*> a = \r -> f r (a r)
18
19 instance Monad ((->) r ) where
20 return = pure
21 ra >>= arb = flip arb <*> ra


-- flip :: (a -> b -> c) -> b -> a -> c

-- ra >>= arb = flip arb <*> ra

据我了解,flip 接受一个函数,该函数接受两个参数,然后是两个单独的参数,并返回一个值。在绑定(bind)示例中,我们是否传递 arb作为(a -> b -> c) ,然后<*>作为b在flip的签名中,最后ra作为a ?我看不到。

我尝试使类型更具体地适合我的实际示例,以便您可以重写 <*>作为

(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)

我可以对绑定(bind)做同样的事情

(>>=) :: (r -> a) -> (a -> r -> b) -> (r -> b)

所以即使是像我这样的傻瓜也能看到如果我们可以交换 <*>大约我们可以像这样排队

(<???>) :: (r -> a) -> (r -> a -> b) -> (r -> b)
(>>=) :: (r -> a) -> (a -> r -> b) -> (r -> b)

但是看看第二个参数,第一个参数需要 r作为它的第一个参数,bind 需要一个 a

所以不知何故flip书上的例子就是为我们做的,但我真的不明白怎么做。任何帮助将不胜感激。

谢谢!

最佳答案

我认为顶级困惑点:flip正在修改arb ,不修改<*>正如你所相信的那样。我们已经“修改”<*>只需给出 <*> 即可获得“正确”的参数顺序它的参数与我们得到的顺序相反!

现在了解详细信息。正如您所指出的,我们有:

(>>=) :: (r -> a) -> (a -> r -> b) -> (r -> b)

所以,因为我们在左侧写了

ra >>= arb = ...

那么我们的范围是:

ra :: r -> a
arb :: a -> r -> b

(注意如何选择名称来反射(reflect)类型!)重写您为 flip 指定的类型,我们有

flip :: (a -> b -> c) -> b -> a -> c -- original
flip :: (a -> r -> b) -> r -> a -> b -- rename variables

因此:

flip arb :: r -> a -> b

现在回想 (<*>) 的类型你写的:

(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)

对于 (<*>) 的第一个参数,我们想要 r -> a -> b 类型的东西。嘿! flip arb有那种类型!对于第二个参数,我们需要 r -> a 类型的内容。 。我们又很幸运,因为ra有这种类型,所以...

flip arb <*> ra :: r -> b

(与中缀运算符一样,这​​是运算符 (<*>) 参数 flip arbra 的应用。)我们希望拥有什么类型?好吧,我们回到 (>>=) 的类型现在:

(>>=) :: (r -> a) -> (a -> r -> b) -> (r -> b)

接受两个参数后,应该返回 r -> b 类型的内容。太酷了,这就是我们所构建的。

ra >>= arb = flip arb <*> ra

关于haskell - 从应用 (<*>) 混淆中派生 monad 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54313967/

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