作为Haskell的初学者,我发现很难在视觉上识别出一些模式匹配的例子。
似乎在let绑定中有时模式匹配发生在lhs上,当调用一个函数并且值绑定到rhs上的等式中的变量时,如下面的代码示例所示:
let boot x y z = x * y + z in boot 3 4 2
然而,有时会在rhs中运行一个函数,并且该函数的 return 值将被绑定到等式的lhs中的值,如State Monad的定义中的“Learn you一个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”是否需要用括号括起来进行模式匹配?我试图找到关于模式匹配如何发生的确切解释。
我已经阅读了大部分“了解你是一个很好的Haskell”,以及“真实世界Haskell”和“Haskell的温和介绍”的片段,我还没有找到一个明确的解释,如何确定是否模式匹配应该出现在函数的参数或函数的返回值上。任何帮助清除这一点将不胜感激。
答案 0 :(得分:6)
我相信你绊倒了function and pattern bindings之间的差异。
简而言之,如果您有类似" 变量 pat1 pat2 ... =" (其中 pat1 pat2 ...是一个或多个模式),它是一个函数绑定;否则它是一种模式绑定。在最简单的情况下,x y z = ...
,函数绑定只是lambda的语法糖:x = \y z -> ...
。
如果以(
开头,则它不是变量,因此整个事物必须是模式绑定。但即使没有parens State x
仍然是模式绑定,因为State
不是变量(它以大写字母开头,因此它必须是构造函数)。