Haskell let on 函数中的模式匹配 return vs 函数参数

Haskell Pattern matching in let on function return vs function arguments

作为 Haskell 的初学者,我发现很难通过视觉识别一些模式匹配示例。

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

let boot x y z = x * y + z in boot 3 4 2

然而,有时一个函数在 rhs 中是 运行,而该函数的 return 值将绑定到 lhs 中的值"Learn you a 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 

其中函数 h 运行 具有 lambda 参数 s 并且 return 值绑定到 (a, newState)。

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

let f a b = g c d in ...

其中函数 g return 是一个函数和两个参数,因为它是 return 值。在这种情况下,是否需要将 "f a b" 括在括号中才能进行模式匹配?我正在尝试找到模式匹配如何发生的明确解释。

我已经阅读了 "Learn You A Haskell For Great Good" 的大部分内容以及 "Real World Haskell" 和 "A Gentle Introduction to Haskell" 的片段,但我没有找到关于如何确定模式匹配是否应该的明确解释发生在函数的参数或函数的 return 值上。如果您能帮助解决这个问题,我们将不胜感激。

我相信您正在为 function and pattern bindings.

之间的区别而犯错

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

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