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

shi*_*mer 4 haskell pattern-matching

作为Haskell的初学者,我发现很难在视觉上识别出一些模式匹配的例子.

似乎在let绑定中有时模式匹配发生在lhs上,当调用一个函数并且值绑定到rhs上的方程中的变量时,如下面的代码示例所示:

let boot x y z = x * y + z in boot 3 4 2
Run Code Online (Sandbox Code Playgroud)

然而,有时函数将在rhs中运行,并且该函数的返回值将被绑定到等式的lhs中的值,如"了解你的Haskell"中State Monad的定义:

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 
Run Code Online (Sandbox Code Playgroud)

函数h使用lambda参数s运行,返回值绑定到(a,newState).

对于一个新的Haskell程序员来说,这有点令人困惑.我可以想象你可能会遇到的情况:

let f a b = g c d in ...
Run Code Online (Sandbox Code Playgroud)

函数g将返回一个函数,两个参数作为返回值.在这种情况下,"fa b"是否需要用括号括起来进行模式匹配?我试图找到模式匹配如何发生的明确解释.

我已经阅读了大部分"了解你是一个很好的Haskell",以及"真实世界Haskell"和"Haskell的温和介绍"的片段,我还没有找到一个明确的解释,如何确定模式匹配是否应该在函数的参数或函数的返回值上发生.任何帮助清除这一点将不胜感激.

mel*_*ene 6

我相信你在功能和模式绑定之间的差异磕磕绊绊.

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

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