gpt4 book ai didi

haskell - Haskell 的函数单子(monad)中的绑定(bind)是如何工作的?

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

从学你一个haskell:http://learnyouahaskell.com/for-a-few-monads-more

函数的 Monad 实例是这样的:

instance Monad ((->) r) where  
return x = \_ -> x
h >>= f = \w -> f (h w) w

我无法理解以下输出:
import Control.Monad.Instances  

addStuff :: Int -> Int
addStuff = do
a <- (*2)
b <- (+10)
return (a+b)
addStuff 3返回 19。书上说 3 作为参数传递给 (*2) and (+10) .如何?

来自 h >>= f = \w -> f (h w) w , 好像是 (h w)正在绑定(bind)到 a 或 b。
那么,为什么 6 没有被传入(+10)?

我对 f 的理解这是当 (*2)h , faddStuff 的最后两行.当 (+10)h , faddStuff 的最后一行(在本例中为 return 语句) .

最佳答案

让我们先desugar the do block [Haskell'10 report] :

addStuff = do
a <- (*2)
b <- (+10)
return (a+b)

相当于:
addStuff = (*2) >>= \a -> ((+10) >>= \b -> return (a + b))

因此,内部绑定(bind)表达式 ( (+10) >>= \b -> return (a + b)) 可以通过绑定(bind)定义转换为:
\w -> (\b -> return (a + b)) ((+10) w) w

如果我们替换 returnconst ,因此我们得到:
\w -> (const . (a+)) ((+10) w) w

因此,我们有一个函数将 w 作为输入,然后调用 const . (a+)(w+10)w , 所以它会忽略最后一个 w .语义上等价于:
(a+) . (+10)

所以现在我们的 addStuf相当于:
addStuff = (*2) >>= \a -> ((a+) . (+10))

如果我们现在再次使用绑定(bind)运算符的定义,我们会看到:
\w -> (\a -> ((a+) . (+10))) ((*2) w) w

或更短:
\w -> (\a -> ((a+) . (+10))) (w*2) w

我们现在可以替换 a(w*2)并获得:
\w -> ((w*2)+) . (+10)) w

所以我们的 addStuf相当于:
addStuff w = (w*2) + (w+10)

或更简单:
addStuff w =  3*w + 10

关于haskell - Haskell 的函数单子(monad)中的绑定(bind)是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54733069/

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