函数式编程
TRANSCRIPT
编程语言图谱
n 函数式语言
n 程序 = Function(input)n 关注焦点:What to do?n SQL、Lisp、Haskell、Clojure(JVM)、erlang
n 命令式语言
n 程序 = 赋值 | 顺序语句 | 分支语句 | 循环语句n 关注焦点:如何进行计算、中间状态管理、图灵机
n C、C++、Java
n 混合式语言
n 支持函数
n 支持命令控制流
n Javascript、Ruby、Python、Groovy(JVM)、Scala(JVM)n Java8 lambda特性
表达式而非语句
n 表达式 vs 语句n Expression:函数求值过程,无副作用n Statement:命令陈述,无返回值,产生副作用
n 纯函数式语言
n 没有if/while/switch/for等控制流n if 是函数(表达式)而非命令n 没有循环,使用递归替代
n 没有自由变量
n 没有return, break, continue等修改执行路线的指令n Scala
n 保留了while、returnn for/try/catch/match 都是表达式
函数是一等公民
n 函数是值
n 可以存储到变量中
n 可作为参数传递
n 可作为返回值
n λ(lambda)n Closuren Closure vs Inner Class
n 高阶函数
n Curry
神奇的高阶函数
n Mappingn map、flatMap、foreach
n Filteringn filter、partition、find、takeWhile、dropWhile、span
n Predicaten forall、exists
n Foldingn foldLeft, foldRight, scanLeft, scanRight
n Othersn sum, product, average,max,minn sort, sortWith, sortByn group, groupBy
n ? 怎么看上去与SQL相似
引用透明性
n C/C++/Java的方法是函数吗?n 引用透明:
n 函数的返回值只依赖于调用的参数
n 相同的调用参数应该返回相同的结果
n 不依赖外部环境
n 建议:在C/Java中更多的写引用透明的函数
无副作用
n 没有变量
n erlang:变量只能赋值一次,不可更改n scala:支持var,但推荐不使用var
n 不变对象(imutable object)n Stringn 对象一旦创建,永不更改
n 需要变更:返回新的对象
n Persistent data structure: Wikipedian Listn Map
Scala Overview
n 混合式编程语言
n 面向对象
n 函数式编程
n 相比Javan 和Java高度协作:你的都是我的。n 类型推演:但我比你更简单
n 模式匹配、XML:也比你更方便n 函数式支持、高级函数、Actor模型:更重要的,我比你更强大。
n 相比Javascript、Python、Rubyn 脚本式的语言:我们都很简洁、灵活,都很敏捷
n 强类型、静态类型:但我不会有语法层面的低级错误,重构友好
n 高性能:而且我的性能和Java是一致的
Why FP?
n 更高的逻辑抽象能力
n 代码可读性
n 更短:Scala代码量一般为Java代码量的1/3-1/5n 描述性代码:更直白的代码
n 代码质量
n 可测试性:引用透明性
n 隐性的BUG几率:不变量、不变对象、无副作用n 代码可维护性
n 热升级
n 并发友好
n 锁是并发最大的敌人:性能、正确性
n 无锁模式的并发:Actorn 分布式计算、并发计算