gpt4 book ai didi

haskell - 非一元函数的绑定(bind)运算符

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

我或多或少地关注着单子(monad),但我无法推断出如何表达

(>>=) id (+) 3

计算结果为 6。表达式似乎以某种方式简化为

(+) 3 3

但是怎么办呢? 3 如何应用两次?有人可以解释一下幕后发生了什么吗?

最佳答案

这来自>>=定义为((->) r)类型:

(f =<< g) x  =  f (g x) x

因此

(>>=) id (+) 3
=
(id >>= (+)) 3
=
((+) =<< id) 3
=
(+) (id 3) 3
=
3 + 3

查看类型:

> :t let (f =<< g) x = f (g x) x in (=<<)
let (f =<< g) x = f (g x) x in (=<<)
:: (t1 -> (t2 -> t)) -> (t2 -> t1) -> (t2 -> t)

> :t (=<<)
(=<<) :: Monad m => (a -> m b) -> m a -> m b

类型匹配

t1 ~ a
(t2 ->) ~ m -- this is actually ((->) t2)`
t ~ b

因此约束 Monad m这里的意思是Monad ((->) t2) ,这定义了 =<< 的定义和>>=哪些被使用。

如果你想从类型中推导出定义,

(>>=) :: Monad m => m a -> (a -> m b) -> m b
m ~ ((->) r)

(>>=) :: (r -> a) -> (a -> r -> b) -> (r -> b)
(>>=) f g r = b
where
a = f r
rb = g a
b = rb r

简化后就变成了我们上面使用的。

如果你想“用语言”理解它,

(=<<) :: (Monad m, m ~ ((->) r)) => (a -> m b) -> m a -> m b
(f =<< g) x = f (g x) x
  • g是一个“可以计算”“a”的“一元值”,表示为r -> a
  • f a计算“可以计算”“b”的“一元值”,表示为r -> b ,
  • 因此\x -> f (g x) x是一个一元值,给定“b ”,“可以计算”“r ”。

所以这些“非一元函数”实际上是一元值,而它们恰好是函数。

因此在您的示例中,g = id , f = (+) ,并且

  • id是一个“一元值”,“可以计算”“a”、a -> a
  • (+) a计算一个“一元值”,“可以计算”“b”、a -> b ,其中b实际上也是一个a ,
  • 因此\x -> (+) (id x) x是一个一元值,给定“a ”,“可以计算”“a ”:
(>>=) id (+)
=
((+) =<< id)
=
\x -> (+) (id x) x
=
\x -> (+) x x

关于haskell - 非一元函数的绑定(bind)运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67934377/

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