gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:21:21 25 4
gpt4 key购买 nike

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

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

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

然而,有时函数会在 rhs 和 中运行。返回 该函数的值将绑定(bind)到等式 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 运行,返回值绑定(bind)到 (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”的片段,我还没有找到关于如何确定模式匹配是否应该的明确解释出现在函数的参数或函数的返回值上。任何帮助解决这个问题将不胜感激。

最佳答案

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

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

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

关于函数返回与函数参数中的 Haskell 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31677603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com