函数返回与函数参数中的Haskell模式匹配

时间:2015-07-28 13:22:01

标签: haskell pattern-matching

作为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的温和介绍”的片段,我还没有找到一个明确的解释,如何确定是否模式匹配应该出现在函数的参数或函数的返回值上。任何帮助清除这一点将不胜感激。

1 个答案:

答案 0 :(得分:6)

我相信你绊倒了function and pattern bindings之间的差异。

简而言之,如果您有类似" 变量 pat1 pat2 ... =" (其中 pat1 pat2 ...是一个或多个模式),它是一个函数绑定;否则它是一种模式绑定。在最简单的情况下,x y z = ...,函数绑定只是lambda的语法糖:x = \y z -> ...

如果以(开头,则它不是变量,因此整个事物必须是模式绑定。但即使没有parens State x仍然是模式绑定,因为State不是变量(它以大写字母开头,因此它必须是构造函数)。