返回文章列表

文章

Get Programming with Haskell-5

闭包(closures)和部分应用(partial application)

部分内容超过 Notion API 单页读取上限,已尽力加载可访问内容。

# 1、CLOSURES AND PARTIAL APPLICATION ## 1、Closures—creating functions with functions 在上一节中我们抽象了如下函数 ```haskell ifEvenInc n = ifEven inc n ifEvenDouble n = ifEven double n ifEvenSquare n = ifEven square n ``` 虽然使用**函数作为参数**有助于简化代码,但你会发现仍然存在**重复的编程模式**!除了传递给 **`ifEven`** 的函数不同外,这些定义几乎完全相同。此时,你需要一个能够自动生成 **`ifEvenX`** 系列函数的工具。为此,可以创建一个**返回函数的新函数**,命名为 **`genIfEven`**(生成偶判断函数),其逻辑如下图所示。 ![](https://prod-files-secure.s3.us-west-2.amazonaws.com/4b1b167f-4b52-4031-8233-f4f2689af574/e0b2e491-7ace-4bc3-b7d9-f7a93e00cad5/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466QHPDSL3S%2F20260827%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260827T181915Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEHEaCXVzLXdlc3QtMiJIMEYCIQCQNOVizSACqVemv1K3eE77qGeeLAd4b3GXDC%2F9dsR3rgIhALN%2FzRwBZkn%2F8ov%2FCNg%2Bh%2F%2BEYxAcMUAHEBRHBVq5OEXSKv8DCDoQABoMNjM3NDIzMTgzODA1IgwuaHZMo5c0NxZsONMq3AOGyo8C7jxx0AUI7Cd5HCpHMGcWQMOKjOA68enyCUdf%2BQSdzfHamA8a9XqrHmydCceYCY0S5%2FU9Yrylc%2FHIbgltdyFcgmMCbFKa4nA3Kf4089rx7Jr2K9YFpVy20oMydhSbRp2j3gWwOnUd4StL%2BEJuCLfccTSVTVRyvmSWVg9H%2BEAh%2FtcKstx%2BB%2B9TeN7rjtd7CkjtP3jeDgqVWgxz7xm2tqW6FE9JT0JNiNOfbsRyaYd7gdUUv5Xk7U7TRAl5tYqBwcCHUE8Uxsa4ExpLcD%2B8aSWMwBhM%2F1FYSw1q1badJNby64II0dtCpgQTRZHBEyOT1tdRJFXGgJFCIRQx8trYAqLMRN8yByaOfwtcpIW2Msi1Obfdwfzmgc183VNWbEkFyiYQp2u00K0R%2F%2F2Bax36vYSLM9eOHY%2FLOzMzn9%2FJwM4TYvgpW71MF6SUz5B97uBDi%2BeKwAg%2BaXHZ81RDm2%2FaVMiKmrZ58uw4yr3Gv%2Feyp5lNM5XnXItt7bR2z%2Fc0EBO68merbbaqq0tuSHDWcQiEdO56z6lR%2Fm0kG9MFeR9st7SxVVnYWuHBIS1q1wT5h8fOJMAT5EWzcFZaZb8BE9eY80bh5lmzkOyd1%2B9yF%2B1Hk90LShqFsmUpw0rhijDlzMHUBjqkASFmR3qJi7epSVlmKQHMfcMe0atTQV75IZUkI4haJ960Z9eJx9fv9CMMnV7IDJv4npFDQB8cZTA4gVAdBhBVfPYFdIdO8ysOmdfQwk7aU64nsQY7tQnd8ISgzUNMMynMd4llGcqYnaHY2BCkd4pTV%2F7z805AZHypbM0hcrCj65QoN5NMrtFv%2F2uLbxcImuysw2j4on4jTMCeiaysCeeppqBXYas9&X-Amz-Signature=fae17a5723eab568f5bfeea75c1a4c1372397f5cfe3765775cfc5441e1adef95&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject) 现在,你正在传入一个函数并返回一个 lambda 函数。传入的函数f会在 lambda 函数内部被捕获!当你在 lambda 函数中捕获一个值时,这便称为**闭包**。 即使在这个简单的示例中,要完全理解其内部机制也可能有一定难度。为了更好地观察这一过程,我们来看看如何通过genIfEven创建ifEvenInc函数。 ![](https://prod-files-secure.s3.us-west-2.amazonaws.com/4b1b167f-4b52-4031-8233-f4f2689af574/674ad840-a7dd-4f39-b8b1-02af00a4ff4e/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466QHPDSL3S%2F20260827%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20260827T181915Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEHEaCXVzLXdlc3QtMiJIMEYCIQCQNOVizSACqVemv1K3eE77qGeeLAd4b3GXDC%2F9dsR3rgIhALN%2FzRwBZkn%2F8ov%2FCNg%2Bh%2F%2BEYxAcMUAHEBRHBVq5OEXSKv8DCDoQABoMNjM3NDIzMTgzODA1IgwuaHZMo5c0NxZsONMq3AOGyo8C7jxx0AUI7Cd5HCpHMGcWQMOKjOA68enyCUdf%2BQSdzfHamA8a9XqrHmydCceYCY0S5%2FU9Yrylc%2FHIbgltdyFcgmMCbFKa4nA3Kf4089rx7Jr2K9YFpVy20oMydhSbRp2j3gWwOnUd4StL%2BEJuCLfccTSVTVRyvmSWVg9H%2BEAh%2FtcKstx%2BB%2B9TeN7rjtd7CkjtP3jeDgqVWgxz7xm2tqW6FE9JT0JNiNOfbsRyaYd7gdUUv5Xk7U7TRAl5tYqBwcCHUE8Uxsa4ExpLcD%2B8aSWMwBhM%2F1FYSw1q1badJNby64II0dtCpgQTRZHBEyOT1tdRJFXGgJFCIRQx8trYAqLMRN8yByaOfwtcpIW2Msi1Obfdwfzmgc183VNWbEkFyiYQp2u00K0R%2F%2F2Bax36vYSLM9eOHY%2FLOzMzn9%2FJwM4TYvgpW71MF6SUz5B97uBDi%2BeKwAg%2BaXHZ81RDm2%2FaVMiKmrZ58uw4yr3Gv%2Feyp5lNM5XnXItt7bR2z%2Fc0EBO68merbbaqq0tuSHDWcQiEdO56z6lR%2Fm0kG9MFeR9st7SxVVnYWuHBIS1q1wT5h8fOJMAT5EWzcFZaZb8BE9eY80bh5lmzkOyd1%2B9yF%2B1Hk90LShqFsmUpw0rhijDlzMHUBjqkASFmR3qJi7epSVlmKQHMfcMe0atTQV75IZUkI4haJ960Z9eJx9fv9CMMnV7IDJv4npFDQB8cZTA4gVAdBhBVfPYFdIdO8ysOmdfQwk7aU64nsQY7tQnd8ISgzUNMMynMd4llGcqYnaHY2BCkd4pTV%2F7z805AZHypbM0hcrCj65QoN5NMrtFv%2F2uLbxcImuysw2j4on4jTMCeiaysCeeppqBXYas9&X-Amz-Signature=958f8f42228b6a1d0a70a7ad54440eff3d8b0c1187bcc18598946cf972d15504&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject)