了解维基百科的Haskell可能monad的例子

时间:2014-09-14 08:19:46

标签: haskell monads maybe

我想我理解Haskell中的monad概念,即>> =和return的作用。但是,我对它在Wikipedia example中的应用语法感到有些困惑。

add :: Maybe Int -> Maybe Int -> Maybe Int
add mx my =             -- Adds two values of type (Maybe Int), where each input value can be Nothing
  mx >>= (\x ->         -- Extracts value x if mx is not Nothing
    my >>= (\y ->       -- Extracts value y if my is not Nothing
      return (x + y)))  -- Wraps value (x+y), returning the sum as a value of type (Maybe Int)

我清楚地理解了这个功能的意图。我对评估的顺序感到有些困惑。任何人都可以逐行显示函数的哪一部分被评估(假设mx和my的类型为Maybe 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?

1 个答案:

答案 0 :(得分:3)

牛米。给出了答案的关键,因为我错误地更换了值。

我们必须应用beta减少。

引用Haskell Wiki:

  

例如,假设我们应用函数

     

(\ x - > 2 * x * x + y)到值7.要计算结果,我们   每次自由出现x代替7,所以应用了   函数(\ x - > 2 * x * x + y)(7)被简化为结果

     

2 * 7 * 7 + y

http://www.haskell.org/haskellwiki/Beta_reduction

然后,将其应用于我提出的功能

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')