函数式编程

23
函数式编程 waltwang

Upload: wang-zaixiang

Post on 12-Apr-2017

16 views

Category:

Software


0 download

TRANSCRIPT

函数式编程

waltwang

目录

n 翠花:上代码

n 编程语言图谱

n 函数式语言的基本特征

n Why FP?

代码范例:quick sort

代码范例:StringUtils.isBlank

代码范例:JDBC Access

编程语言图谱

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特性

FP基本特征

n 使用表述式而非语句

n 函数是一等公民

n 引用透明性

n 无副作用

表达式而非语句

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 if

表达式而非语句

n for

表达式而非语句

n try/catch

n Pattern Match

函数是一等公民

n 函数是值

n 可以存储到变量中

n 可作为参数传递

n 可作为返回值

n λ(lambda)n Closuren Closure vs Inner Class

n 高阶函数

n Curry

函数是值

n 赋值给变量

n 作为参数

函数是值

n 作为返回值

神奇的高阶函数

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相似

神奇的高阶函数:Fork-Join

n ForkJoin实现:40行Python代码n 源代码:https://gist.github.com/4123733

神奇的高阶函数 Map-Reduce

n map_reduce 实现为20行python代码n 命令模式的chanelonline_sync版本代码非常复杂

引用透明性

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

其它特性

n 递归调用

n JVM缺乏递归支持n 模式匹配

n 简化代码

n Lazy evaln if 函数如何实现?

n REPL

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 分布式计算、并发计算

探讨

n Unix shell 中的管道与 FP?n 在混合型语言中应该FP

n JavaScriptn Pythonn PHP

n App Platform与FP?