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