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

Posted

技术标签:

【中文标题】函数返回与函数参数中的 Haskell 模式匹配【英文标题】:Haskell Pattern matching in let on function return vs function arguments 【发布时间】: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 values State 和 (,) 是构造函数。 (a, newState) = h s中,函数h返回一个tuple... @melpomene,我认为这是我一直在寻找的区别,如果 lhs 上有数据构造函数,那么模式匹配发生在 rhs 的返回值上是否正确? 【参考方案1】:

我相信您对function and pattern bindings 之间的区别感到困惑。

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

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

【讨论】:

以上是关于函数返回与函数参数中的 Haskell 模式匹配的主要内容,如果未能解决你的问题,请参考以下文章

如何在haskell中对两个参数进行模式匹配

Haskell:绑定模式匹配的地方

Haskell 编写几个递归函数 练习 typeclass 模式匹配等

你如何在 Haskell 中使用模式匹配和元组列表?

C++模版编程实现Haskell的函数模式匹配特性

Haskell 和 Erlang 中的模式匹配