【发布时间】:2015-10-19 02:03:03
【问题描述】:
作为 Haskell 的初学者,我发现很难从视觉上识别一些模式匹配示例。
似乎在 let 绑定中,有时当调用函数时模式匹配发生在 lhs 上,并且值被绑定到 rhs 上等式中的变量,如下面的代码示例:
let boot x y z = x * y + z in boot 3 4 2
但是,有时函数会在 rhs 中运行,并且该函数的 return 值将绑定到等式的 lhs 中的值,如“Learn you”中的 State Monad 定义Haskell”:
instance Monad (State s) where
return x = State $ \s -> (x,s)
(State h) >>= f = State $ \s -> let (a, newState) = h s
(State g) = f a
in g newState
函数 h 使用 lambda 参数 s 运行,返回值绑定到 (a, newState)。
对于一个新的 Haskell 程序员来说,这有点令人困惑。我可以想象一个场景,您可能会遇到:
let f a b = g c d in ...
函数 g 将返回一个函数和两个参数作为它的返回值。在这种情况下,“f a b”是否需要用括号括起来才能发生模式匹配?我正在尝试找到模式匹配如何发生的明确解释。
我已经阅读了“Learn You A Haskell For Great Good”的大部分内容,以及来自“Real World Haskell”和“A Gentle Introduction to Haskell”的sn-ps,我还没有找到关于如何确定的明确解释如果模式匹配应该发生在函数的参数或函数的返回值上。如有任何帮助,我们将不胜感激。
【问题讨论】:
-
return a function and two arguments as it's return valuesState 和(,)是构造函数。 -
在
(a, newState) = h s中,函数h返回一个tuple... -
@melpomene,我认为这是我一直在寻找的区别,如果 lhs 上有数据构造函数,那么模式匹配发生在 rhs 的返回值上是否正确?