@
anubiskong 客气了, 我学到点皮毛, 深入的要看知乎上有些 Haskell 的阐述,
我是在前端这边跟进函数式方案写 UI 的套路的, 这边带来的抽象改变很大,
以往我们写程序就是写一堆状态, 然后想怎么操作, 再想到把复用的过程合并到一起, 再把特定的界面抽象为对象称为组件, 然后组件之间相互作用抽象为消息, 这样一个套路构建一套前端 MVC 方案处理, 比如说 Backbone.
到了函数式编程整个思维还在改变, 引入了不可变数据. 因为用对象化的方式思考问题常常带来很多组件的局部状态, 状态多了组件之间的消息通讯也很复杂, 最终不敢随便扩大规模. 但是函数式的思路是引入不可变数据(消耗性能和计算量为对价), 把 MVC 的 Model 抽象为一个整体随时间更新, 把 View 部分整个用 DSL 抽象一遍, 也就是 React 那边发生的组件化开发跟性能优化的事情.
因为在函数式编程当中数据不可变性(以及对副作用的限制), 函数复用的可靠性相比不做限制的语言大大增强, 可以做更复杂的复用和抽象. 特定在前端的话, JavaScript 除了可变的数据结构, 还有 this 之类很多奇怪的问题影响到复杂的抽象过程, 可靠性上有点问题, 虽然功力够的话写大型软件也不是不可以. 结果就是在 Elm 和 React 这样的方案中相对容易去做 DOM 操作的合并, 做运行时的代码替换, 做 Time travel debugging, 做组件化, 而其他方案相对复杂一些. 术语方面可能不严谨, 但应该表达清楚.
在 Haskell 里边的话还有类型类,并发,副作用之类的抽象, 我说不上来.