主要观点:函数式编程强调纯函数,本文探讨了纯函数的定义及相对性,以 Go 和 Haskell 代码为例说明在不同语言中实现纯函数的情况及相关问题,还提出了在命令式语言中创建可纯化核心的方法,并介绍了 Haskell 中类似的可纯化代码实现。
关键信息:
- 纯函数只考虑输入或不可变外部值,不改变其他值,每次给定相同参数返回相同结果。
- 纯代码无“效果”,即不改变环境可被其他代码见证,在 Haskell 中评估无限列表等情况虽被视为纯但实际有影响。
- Go 中
Tail10
函数是否为纯函数取决于WebpageFetcher
的实现,特定实现下可为纯函数。 - 命令式语言可创建可纯化的模块,如在命令式语言编程时将业务逻辑与不纯代码分开,测试时使用模拟实现使业务逻辑相对纯。
- Haskell 中可通过自由幺半群实现类似可纯化代码,虽有多种方式但不常用,因为常规纯核心能满足需求且此方式较复杂。
重要细节: - 在 Haskell 中
red
虽在外部模块但因其不可变,maskRed
仍为纯函数,而在命令式语言中函数可能包含对可变值的引用。 - 在 Haskell 中尝试将高度颗粒化的函数风格引入命令式语言会带来很多痛苦且收益不高,各语言细节和成本收益比不同。
- 几乎每个命令式语言库都不是纯的,要将其隔离为纯值较困难。
- 在 Haskell 中创建可纯化代码时,不同的解释器会影响
program
的纯度,且此过程在 Haskell 中较复杂。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。