Plain Functional Programming by Martin Odersky - 笔记
- 前言
- 软件工程中最大的挑战是什么?
- 为什么需要函数式编程?
- 为什么 Scala 和 Haskell 看起来不像是简单的语言?
- 函数式编程家族
- 函数式编程的好处
- 例子: 配置
- 当参数的太多的时候, 使用隐式参数来简化
- 构建者模式
- 总结
前言
来自 @演讲: Plain Functional Programming by Martin Odersky
软件工程中最大的挑战是什么?
最大的挑战是复杂性, 复杂性可能来源于需求的变化, 开发者的变动, 态度 等等
为什么需要函数式编程?
因为函数式编程在复杂性管理方面, 移除了复杂性中的一个重要的维度: 查看历史代码.
为什么 Scala 和 Haskell 看起来不像是简单的语言?
语法数量如下图所示: 所谓大道至简.
函数式编程是另外一种范式, 没有以前的经验, 所以看起来比较难
函数式编程家族
函数式编程的好处
“函数式编程就是把所有东西都参数化”
但是这样会带来问题
一种解决方案是使用Monad进行抽象
例子: 配置
使用 Kleisli 和 Arrow 来构建一个读配置的程序
当参数的太多的时候, 使用隐式参数来简化
但是隐式参数太多也会导致问题
解决办法是, 声明一个隐式函数类型
这个 Configured[T] = implicit Config => T
就是带隐式参数的函数, 这样我们就可以把代用隐式参数的函数转换成 Configured[T] 类型了
代数效应: 多个隐式参数函数类型顺序可以任意变换, 类似于集合 , 比如 下面的Possibly[Configured[A]]
和 Configured[Possibly[A]]
是一样的
相比于 Kleisli, 隐式函数类型可以省略很多参数
构建者模式
scala 的实现方式
总结
- 简化是最终的目标
- 函数式编程有用, 但不是银弹
- 抽象有用, 但是引入固有的额外的复杂性
- 需要平衡各方开销
- 有时候(Martin说大部分时候) 纯函数是更好的选择