我想我理解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?
答案 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')