JS函数式编程【译】5. 范畴论
第五章 范畴论
托马斯·沃森(时任IBM董事长)说过一句著名的话,“我想全世界只有五台计算机的市场”。 那是1948年,当时,每个人都认为计算机只会被用于两件事情:数学和工程。 即使是技术上最大胆的预想也不会认为有一天计算机能够把西班牙语翻译成英语, 或者模拟整个天气系统。在那时最快的计算机是IBM的SSEC,每秒能计算50次,显示终端要在15年后才出现, 多任务处理意味着多个用户终端共享一个单线程。晶体管改变了一切,然而对技术的远见没有跟上。 在1977年,Ken Olson(DEC创始人)说过另一个愚蠢的预言:“任何人都没有理由想在家里拥有个计算机”。
对于我们来说很明显计算机不只是为科学家和工程师所用,但这只是事后诸葛。在70年前认为计算机只能作数学计算是很正常的。 沃森不仅没有意识到计算机会改变社会,他还没有意识到数学的改革和演进的能力。
不过计算机和数学的潜力并非被所有人忽视。约翰·麦卡锡在1958年发明了Lisp,这是一个革命性的基于算法的语言, 它把计算机带入了新纪元。从那开始,Lisp对使用抽象层的思想(编译、解释、虚拟化)起到重要作用, 这促使了计算机从一个只能用于数学的机器变成了今天这样。
从Lisp到Scheme,一个JavaScript的直接原型。现在它给我们带来了一个轮回。如果计算机在核心上只是一个做数学的机器, 那么它在以数学为基础编程范式上具有优越性是合理的
这里所说的“数学”并不是指计算机明显能做的数字运算,而是要描述为离散数学:对于离散的、 对于诸如逻辑上的声明或者计算机语言命令的数学结构的研究。 通过把代码作为离散的数学结构来对待,我们可以把概念和想法应用到数学上。 这也就是为什么函数式编程在人工智能、图谱搜索、模式识别以及其它计算机科学中具有挑战性的领域里具有如此重要的地位。
这一章我们将针对日常编程中的问题对一些概念和它们的应用进行试验,包括:
- 范畴论(Category theory)
- 态射(Morphisms)
- 函子(Functors)
- Maybes
- Promises
- Lenses
- 函数组合
利用这些概念我们可以轻松安全地写出整个库和API。并且我们要从对范畴论的解释开始一直到它在JavaScript里的实现。