返回文章列表

文章

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=ASIAZI2LB466SWHMV2IA%2F20261016%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20261016T231709Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjECYaCXVzLXdlc3QtMiJHMEUCICXjwLfAE65e%2BKWDiy3WwhxPhSLj4Y8QZ325sdyrnva3AiEAmC2Qn7c8fN8VDvpWtwitA8zVeFZP8ar3xxcD2vRhag0qiAQI7%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDFR6KushMWciQZTJ6CrcA1KzcYleodXJxqz70I2V2m2Lbp66XjevbUaTHVhalKZ9v4BqnkELsEjUx3%2BulMjCDvGezQGOmk8JDD2xCC0J0CBXVrcXa1Rw%2Fu9R4YVf8DPtTp0KGmU4OflFs7VYpSVdOcEdV9mWg2p30APZWP8I8KOs4JKfh9%2F9Lfbx1ma50ENWoooConcR%2BAWiLsZsBx19h%2BXq7LPU2cItqUGxWOm0VpXNG1F3xK8tNxnR3HIYDkPUfOd9mNCTVSoC54TonQ%2F39ZA80PnMneWypPPB4DTBuzekLmcWuSK6ERm2udtYcqwmQupMD3xtghlgRVSRZr1%2B7sPOJm1QVUoSqh0a4cdmf7Nrbh1KFUFNago9AcKsyssctIm4XDqVzIyrueJN%2FmzaUEXKLU%2Fkj7YJUVRVWQsRZuQSyeFaWHAqq36IMisYdChYokAB5kzgU5AqlrOabe3tejEYvpT65NuDPsHG34LOLxR1EdCdz%2FDFAMEmF5gwCVWhIiJlV6YlivrxeHiAyx9r0K42Q9O5t4Phh1xHSMTU4R%2B0SVNw5pRMry7jyk3E2gPAZCjKdogn6DVsRKhhPJj39FftteR4Lr1WcAVpS4CC3eLG%2F23oYLKlCuowkPiuSReYPKyzxpP2zyI5YTH%2BMPO9ytYGOqUB8POaYftNnVCdfm5Bwe%2BhwFvu6W60hQ5%2BdMJYtaMRltgcEdpgoysBjwL4fXnVVQXvP0zh%2FH62DHt6%2FnQm9te0DNuJAojIbthBfsrh1uucaYfvjItii%2FP683sHSR8emcuFLPr7ErZCD6J0d7OqkfrlsYetyFzO8kmbCVSFvpwnEtt1VCuBRumDJsGdDgoFQOy%2FCUB49KVWwocn9luiMcQanH27%2B8jA&X-Amz-Signature=a6e209293fa77f1ba535b449dfe16c77765c83e45222b20a5b0d305cd67c43a3&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject#notion_record=block.1d25c571-bb7d-8018-88e0-f1c325043bad.4b1b167f-4b52-4031-8233-f4f2689af574) 现在,你正在传入一个函数并返回一个 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=ASIAZI2LB466SWHMV2IA%2F20261016%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20261016T231709Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjECYaCXVzLXdlc3QtMiJHMEUCICXjwLfAE65e%2BKWDiy3WwhxPhSLj4Y8QZ325sdyrnva3AiEAmC2Qn7c8fN8VDvpWtwitA8zVeFZP8ar3xxcD2vRhag0qiAQI7%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FARAAGgw2Mzc0MjMxODM4MDUiDFR6KushMWciQZTJ6CrcA1KzcYleodXJxqz70I2V2m2Lbp66XjevbUaTHVhalKZ9v4BqnkELsEjUx3%2BulMjCDvGezQGOmk8JDD2xCC0J0CBXVrcXa1Rw%2Fu9R4YVf8DPtTp0KGmU4OflFs7VYpSVdOcEdV9mWg2p30APZWP8I8KOs4JKfh9%2F9Lfbx1ma50ENWoooConcR%2BAWiLsZsBx19h%2BXq7LPU2cItqUGxWOm0VpXNG1F3xK8tNxnR3HIYDkPUfOd9mNCTVSoC54TonQ%2F39ZA80PnMneWypPPB4DTBuzekLmcWuSK6ERm2udtYcqwmQupMD3xtghlgRVSRZr1%2B7sPOJm1QVUoSqh0a4cdmf7Nrbh1KFUFNago9AcKsyssctIm4XDqVzIyrueJN%2FmzaUEXKLU%2Fkj7YJUVRVWQsRZuQSyeFaWHAqq36IMisYdChYokAB5kzgU5AqlrOabe3tejEYvpT65NuDPsHG34LOLxR1EdCdz%2FDFAMEmF5gwCVWhIiJlV6YlivrxeHiAyx9r0K42Q9O5t4Phh1xHSMTU4R%2B0SVNw5pRMry7jyk3E2gPAZCjKdogn6DVsRKhhPJj39FftteR4Lr1WcAVpS4CC3eLG%2F23oYLKlCuowkPiuSReYPKyzxpP2zyI5YTH%2BMPO9ytYGOqUB8POaYftNnVCdfm5Bwe%2BhwFvu6W60hQ5%2BdMJYtaMRltgcEdpgoysBjwL4fXnVVQXvP0zh%2FH62DHt6%2FnQm9te0DNuJAojIbthBfsrh1uucaYfvjItii%2FP683sHSR8emcuFLPr7ErZCD6J0d7OqkfrlsYetyFzO8kmbCVSFvpwnEtt1VCuBRumDJsGdDgoFQOy%2FCUB49KVWwocn9luiMcQanH27%2B8jA&X-Amz-Signature=9b95e2cbacee35898024bb5adafb633a7bcb8e505fe751b6912c9c0866b5014e&X-Amz-SignedHeaders=host&x-amz-checksum-mode=ENABLED&x-id=GetObject#notion_record=block.1d25c571-bb7d-80fa-bf51-fb1649304d6c.4b1b167f-4b52-4031-8233-f4f2689af574)