什么是函数式编程?

Similar documents
2013 C 1 #include <stdio.h> 2 int main(void) 3 { 4 int cases, i; 5 long long a, b; 6 scanf("%d", &cases); 7 for (i = 0; i < cases; i++) 8 { 9 scanf("%

C/C++ - 函数

附件三

C/C++语言 - 运算符、表达式和语句

Microsoft Word - 食01乙25蔡玉芳28鄭伊娟31閻珮瑜.doc

畢業典禮第一次籌備會議程

LLSS companium

WWW PHP

山东建筑大学学分制管理规定(试行)

第一章

Microsoft Word - 朗诵诵材.doc

06-07周年報告template.PDF

<4D F736F F D20B6C0AE78B0EDAABAC0B8A740B8D65FA7EBA7BAA54EA4E5BEC7ACE3A873C24FA55AA15E2E646F63>

Microsoft Word - F5.docx


C 1

实 习 上 下 点 表 格 解 释 和 相 关 纪 律 要 求 : 1 表 格 中 所 有 名 词 都 为 简 称, 包 括 医 院 名 称 四 年 级 五 年 级 各 专 业 名 称 等 所 有 时 间 都 为 学 生 装 好 行 李 出 发 时 间, 请 提 前 0 分 钟 将 行 李 运 到

简报158期.doc

2016 年 地 质 工 程 系 教 学 工 作 安 排 2016 学 年 我 系 将 在 总 结 过 去 工 作 的 基 础 上, 结 合 今 年 学 院 以 抓 质 量 强 内 涵 促 改 革 调 结 构 建 品 牌 细 管 理 重 过 程 为 宗 旨, 以 规 范 管 理 深 化 内 涵 为

<4D F736F F D203136BCADBBD8D2E4D3EBD1D0BEBF2E646F63>


Microsoft Word - 9pinggb_A4.doc

Microsoft Word - 9pinggb_A4-f4.doc

理 论 探 索 事 业 单 位 改 革 的 五 点 思 考 余 路 [ 摘 要 ] 事 业 单 位 改 革 是 中 国 改 革 的 重 要 环 节, 其 影 响 力 和 难 度 不 亚 于 国 有 企 业 改 革 本 文 着 重 围 绕 推 进 事 业 单 位 改 革 应 考 虑 的 五 个 方 面

2深化教育教学改革、创新人才培养模式

Microsoft Word - 9pinggb_let.doc

Microsoft Word - 9pingb5_let.doc

退休權益.ppt [相容模式]

Microsoft Word - 1.《國文》試題評析.doc

$%%& ()*+, %&, %-&&%%,. $ %,, $,, & /$- 0(1 $%%& %& 234 %-%, 5&%6&633 & 3%%, 3-%, %643 -%%% :::; 7<9; %-%, 3$%$ :::;

# $# #!# # # # # # # %# # # &# # # # #! "

Microsoft Word - ch04三校.doc

Microsoft PowerPoint - plan06.ppt

C/C++语言 - C/C++数据

CC213

Microsoft Word - 第3章.doc

cumcm0206.PDF

C/C++ - 字符输入输出和字符确认

頭 上 下 舌 齒 三 十 二 相 大 智 度 論 卷 4 ( 大 正 25,90a-91a) (22) 四 十 齒 相 (23) 齒 齊 相 (24) 牙 白 相 (26) 味 中 得 上 味 相 (27) 大 舌 相 八 十 種 好 大 般 若 經 卷 381 ( 大 正 6,968a9-969

<4D F736F F D AB4FA5C0A448ADFBA4FEAFC5C0B3C0CBB8EAAEC6B2C4A447B3A1A5F E646F63>

python内存管理

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

Ctpu

Open topic Bellman-Ford算法与负环

ebook14-4

呐喊

C C

数据结构与算法 - Python基础

立法會工商事務委員會

3. 反 映 : 4. 五 花 八 门 : 5. 慷 慨 : 6. 参 与 : 7. 慰 劳 : 8. 延 续 : 9. 珍 爱 : 10. 浪 漫 : 三. 找 出 下 列 每 组 词 中 的 近 义 词 或 同 义 词 : 节 日 节 气 节 令 时 节 习 俗 民 俗 仪 式 风 俗 文 献

chap07.key

Microsoft Word - 苹果脚本跟我学.doc

ebook39-5

untitled

Simulator By SunLingxi 2003

撰 寫 人 :2B1 王 清 燕 書 名 : 追 風 箏 的 女 孩 條 碼 號 : 月 份 閱 讀 心 得 佳 作 我 覺 得 這 是 一 本 教 我 們 用 殘 酷 的 角 度 認 識 生 命 的 小 說 ; 與 同 儕 甚 是 摯 友 間 也 可 能 出 現 競 奪 下 的

002 师 范 高 等 专 科 学 校 人 才 培 养 模 式 改 革 研 究 实 能 力 强 素 质 高, 适 应 地 方 社 会 发 展 和 经 济 建 设 需 要 的 实 用 技 能 型 人 才, 并 为 此 做 了 大 量 的 改 革 与 实 践 工 作, 成 效 显 著 特 别 值 得 一

EC( )19 第 2 頁 理 由 3. 致 力 推 動 香 港 與 內 地 澳 門 以 及 台 灣 建 立 更 緊 密 的 合 作, 並 一 直 在 這 方 面 擔 當 統 籌 協 調 和 推 動 的 角 色 就 內 地 事 務 而 言, 是 香 港 特 別 行 政 區 ( 下 稱 香

untitled

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C Project 30 C Project 3 60 Project 40

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

2005 3

Transcription:

函数式编程 FUNCTIONAL PROGRAMMING byvoid@byvoid.com

什么是函数式编程?

真相是

从停机问题开始 Bug

假设有停机判定算法 function halting(func, input) { } return if_func_will_halt_on_input;

充分利用停机判定 function ni_ma(func) { if (halting(func, func)) { for(;;) // } } ni_ma(ni_ma)

尼玛, 悖论! ni_ma ni_ma

LAMBDA 演算语法 < > ::= < > < > ::= < + >. < > < > ::= (< > < >) x y. x + y

LAMBDA 演算语法 (( x y. x + y) 2 3) let add = x y. x + y (add 2 3)

LAMBDA 演算公理 x y. x + y => a b. a + b ( x y. x + y) a b => a + b

函数生成器 let mul = x y. x * y let con = x y. xy mul 3 5 - > 3 * 5 con BYV oid - > BYVoid

基本表达式 not let not = false - > true true - > false

基本表达式 and let and = true true - > true true false - > false false true - > false false false - > false

广义 AND let and = true value - > value false value - > false value true - > value value false - > false

定义 IF if let if = λ cond tvalue fvalue. (cond and tvalue) or (not cond and fvalue) if true a b - > (true and a) or (not true and b) - > a or false - > a

递归? n let fact = λ n. if (n == 0) 1 (n * fact n- 1) fact

如何表示递归 let fact = λ n. if (n == 0) 1 (n * fact n- 1) let P = λ self n. if (n==0) 1 (n * self(self n- 1)) let fact n = P (P n)

如此一来 fact 4 - > P (P 4) - > if (4==0) (1) (4 * P(P n- 1)) - > 4 * P(P 3) - > 4 * 3 * P(P 2) - > 4 * 3 * 2 * P(P 1) - > 4 * 3 * 2 * 1

可惜 let fact = λ n. if (n == 0) 1 (n * fact n- 1) λ

大胆的想法 fact let P = λ self n. if (n==0) 1 (n * self n- 1) P P(fact) - > λ n. if (n==0) 1 (n * fact n- 1) P(fact) = fact

不动点 P P(fact) = fact

找到不动点 let P = λ self n. if (n==0) 1 (n * self n- 1)

神奇的 Y Y Y(F) = f = F(Y(F)) F(f) = f Y(P) = fact Y

构造 Y 组合子 Y let Y = λ F. G(G) G = λ self. F(self(self))

验证一下 Y(P) = G(G) G = λ self. P(self(self)) = P(G(G)) = λ n. if (n==0) 1 (n * G(G) n- 1) Y(P) = fact Y(P) = fact = λ n. if (n==0) 1 (n * fact n- 1)

终于有了 Y 组合子 self Y Y Y- Combinator Paul Graham Hackers and Painters

图灵等价 Y λ λ λ λ λ

停机问题的等价命题 λ λ n f(n)=g(n)

真实世界中的函数式编程 λ

HASKELL Haskell Haskell Curry Y (Currying) Haskell

HASKELL Haskell for Haskell

第一个 HASKELL 程序 Haskell GHC ghci let max a b = if a>b then a else b Prelude> max 3 4 4 Prelude> max 1.0001 1 1.0001 Prelude> max "BYVoid" "CmYkRgB123" "CmYkRgB123"

列表 Haskell list X :: = [] elem : (list X) = [] [1] = 1:[] [1, 2, 3] = 1:2:3:[] 2:1:3:7:8:[] [2,1,3,7,8]

模式匹配 let first (elem:rest) = elem first [1,3] 1 elem:rest Haskell [1,3] 1:3:[] elem 1 rest 3:[] [3]

列表求和 acc.hs accumulate [] = 0 accumulate (elem:rest) = elem + accumulate rest main = print (accumulate [1,2,3]) runghc acc.hs 6

判断回文 palindrome [] = True palindrome [_] = True palindrome (elem:rest) = (elem == last rest) && (palindrome(init rest)) >palindrome [1, 2, 3, 2, 1] True >palindrome [1, 1, 2] False >palindrome "madam" True

删除连续重复元素 cut cond [] = [] cut cond (elem:rest) = if cond elem then cut cond rest else elem:rest compress [] = [] compress (elem:rest) = elem : compress (cut (== elem) rest) >compress [1, 2, 2, 2, 3, 3] [1, 2, 3] >compress "aaabbaccc" "abac"

惰性求值 Haskell [1..] [1,3..] (eager evaluation) Haskell (lazy evaluation) [1,3..]!! 42 85

FIBONACCI 数列 Haskell Fibonacci fib 0 = 1 fib 1 = 1 fib a = fib (a - 1) + fib (a - 2) O(2 N ) Haskell

线性算法 fib = 1:1:zipWith (+) fib (tail fib) fib!! 4 5 fib!! 42 433494437 fib!! 1000 7033036771142281582183525487718354977018 1269836358732742604905087154537118196933 5797422494945626117334877504492417659910 8818636326545022364710601205337412127386 7339111198139373125598767690091902245245 323403501

解释一下 fib = 1:1:zipWith (+) fib (tail fib) tail tail[1..] [2..] zipwith zipwith (*) [2,3,5] [1,2,3] [2,6,15]

于是 fib = 1:1:zipWith (+) fib (tail fib) 1 [1, 1, 2, 3, 5, 8, 13, 21 ] //fib + [1, 2, 3, 5, 8, 13, 21, 34 ] //tail fib = [2, 3, 5, 8, 13, 21, 34, 55 ]

快速排序 qsort (elem:rest) = (qsort lesser) ++ [elem] ++ (qsort greater) where lesser = filter (< elem) rest greater = filter (>= elem) rest ++ filter

二叉树表示 data Tree a = Empty Node a (Tree a) (Tree a) tree = Node 'd' (Node 'b' d (Node 'a' Empty Empty) (Node 'c' Empty Empty) b e ) (Node 'e' Empty a c g (Node 'g' (Node 'f' Empty Empty) f Empty ) )

中序遍历 inorder Empty = [] inorder (Node value left right) = inorder left ++ [value] ++ inorder right >inorder tree "abcdefg"

树的高度 height Empty = 0 height (Node value left right) = max (height left) (height right) + 1 >height tree 4

高阶函数 traverse func zero Empty = zero traverse func zero (Node value left right) = func value (traverse func zero left) (traverse func zero right) height_func _ a b = max a b + 1 >traverse height_func 0 tree 4

高阶函数 inorder_func value left right = left ++ [value] ++ right inorder = traverse inorder_func [] >inorder tree "abcdefg"

工程中的函数式编程 Haskell Python JavaScript Ruby C++ 11 C# Scala

匿名函数 Python lambda x : x**2 C# x => x**2 JavaScript function (x) {return x * x} C++ 11 [](int x) - > int {return x * x;}

闭包 function make_closure() { var inner_varible = 0; return function () { return inner_varible++; } } var counter = make_closure(); counter(); // 0 counter(); // 1

用闭包实现柯里化 pow function pow5(x) { } return Math.pow(x, 5); pow5(2); // 32

谢谢大家 byvoid@byvoid.com HTTP://WWW.BYVOID.COM/BLOG

参考资料 http://zh.wikipedia.org/wiki/ http://mindhacks.cn/2006/10/15/cantor- godel- turing- an- eternal- golden- diagonal/ /blog/godel- incompleteness- theorems- agnosticism/ http://www.haskell.org/haskellwiki/ 99_questions https://developer.mozilla.org/en/ JavaScript/Guide/Closures http://www.cprogramming.com/c++11/c++11- lambda- closures.html