Haskell 理解维基百科';哈斯克尔的例子';也许是monad

Haskell 理解维基百科';哈斯克尔的例子';也许是monad,haskell,monads,maybe,Haskell,Monads,Maybe,我想我理解Haskell中的monad概念,即>>=和return的角色。然而,我对它们在本文中的应用的语法有点困惑 我清楚地理解这个功能的意图。我只是对评估的顺序有点困惑。任何人都可以逐行显示函数的哪个部分被计算(假设mx和my的类型可能是Int,mx=Just x'和my=Just y',其中x'和y'是Int值) 我认为是这样的: mx >>= (\x -> my >>= (\y -> return (x + y))) --- original (

我想我理解Haskell中的monad概念,即>>=和return的角色。然而,我对它们在本文中的应用的语法有点困惑

我清楚地理解这个功能的意图。我只是对评估的顺序有点困惑。任何人都可以逐行显示函数的哪个部分被计算(假设mx和my的类型可能是Int,mx=Just x'和my=Just y',其中x'和y'是Int值)

我认为是这样的:

mx >>= (\x -> my >>= (\y -> return (x + y)))    --- original
(\x -> my >>= (\y -> return (x + y))) x         --- mx is Just Int, then apply the function in x
(\x -> my >>= (\y -> return (x + y)))           --- x is the first argument. Then I get confused. What's the second part of the function?

n、 m.给出了答案的答案,因为我错误地替换了值

我们必须应用beta减少

引用Haskell维基:

例如,假设我们应用函数

(\x->2*x*x+y)到值7。为了计算结果,我们 用7代替x的每一次自由出现,因此 函数(\x->2*x*x+y)(7)简化为结果

2*7*7+y

()

然后,将其应用于我介绍的函数

mx >>= (\x -> my >>= (\y -> return (x + y)))

(\x -> my >>= (\y -> return (x + y))) x'

my >>= (\y -> return (x' + y)))

(\y -> return (x' + y)) y'

return (x' + y')

你的最后一行不正确。这不是beta减少的工作方式。把
x->
放在第一个
)之后。对
my
…(如果是
just y
,你会得到
(\y->return(x+y))y=return(x+y)=just(x+y)
)当然,如果其中任何一个
,你最终将一无所获(因为
无>=根据定义,f=无
)没错。通过了解beta减少,评估变得更清晰。我添加了我自己的答案。感谢你们两位。在步骤中添加了一行,以更加一致(即显示
(>>=)
运算符的第二个应用程序)。
mx >>= (\x -> my >>= (\y -> return (x + y)))

(\x -> my >>= (\y -> return (x + y))) x'

my >>= (\y -> return (x' + y)))

(\y -> return (x' + y)) y'

return (x' + y')