什么是函数式编程?

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

《人民日报》2004年9月20日

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

LLSS companium

WWW PHP

02

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

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

第一章

第十号 上市公司关联交易公告

Microsoft Word - 朗诵诵材.doc

06-07周年報告template.PDF

<4D F736F F D20B6C0AE78B0EDAABAC0B8A740B8D65FA7EBA7BAA54EA4E5BEC7ACE3A873C24FA55AA15E2E646F63>

Microsoft Word - F5.docx

<4D F736F F D20C8CBB8A3D2BDD2A9BCAFCDC5B9C9B7DDB9ABCBBECFEACABDC8A8D2E6B1E4B6AFB1A8B8E6CAE9A3A8CEE4BABAB5B1B4FABFC6BCBCB2FAD2B5BCA


C 1

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

简报158期.doc

zt

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

<4D F736F F D203136BCADBBD8D2E4D3EBD1D0BEBF2E646F63>

萧山中学课程建设方案.doc


Microsoft Word - 9pinggb_A4.doc

Microsoft Word - 9pinggb_A4-f4.doc

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

日 本 位 于 亚 洲 东 部, 太 平 洋 西 北 角, 是 我 国 东 方 的 一 个 岛 国 在 洪 积 世 ( 注 1) 的 大 部 分 时 期 内, 日 本 与 大 陆 相 连 大 约 在 洪 积 世 晚 期 至 冲 积 世 ( 注 2) 初 期, 日 本 各 地 发 生 海 进, 出 现

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


Microsoft Word - 9pinggb_let.doc

3 基 金 杠 杆 从 分 级 基 金 的 概 念, 我 们 知 道 了 分 级 基 金 的 A 份 额 是 每 年 获 得 固 定 收 益 的 稳 健 份 额,B 份 额 是 具 有 杠 杆 效 应 的 激 进 份 额 分 级 基 金 中 的 杠 杆 一 般 有 三 类 : 份 额 杠 杆 =(A

Microsoft Word - 9pingb5_let.doc

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

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

Ps22Pdf

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

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

Microsoft Word - ch04三校.doc

Figure 1: Game Tree 为 了 方 便 讨 论, 我 们 这 里 设 这 里 讨 论 的 博 弈 树 是 一 棵 有 限 树, 设 有 两 个 棋 手 甲 与 乙 进 行 这 场 博 弈, 这 样, 博 弈 树 分 为 三 类 结 点 : 1. 奇 数 层 的 非 叶 子 结 点 :

Microsoft PowerPoint - plan06.ppt

第5章修改稿

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

07-3.indd

4. 债 务 人 明 确 表 示 撞 行 拖 欠 的 债 务, 这 在 法 律 上 将 引 起 ( ) 人. 诉 讼 时 效 的 中 止 日. 诉 讼 时 效 的 中 黯 C. 诉 讼 时 效 的 延 长 D. 法 定 诉 讼 时 敷 黯 爵 的 改 变 5. 职 工 代 表 大 会 是 国 有 企

CC213

Microsoft Word - 第3章.doc

cumcm0206.PDF

<5B BECBB0EDB8AEC1F25D312D34B0AD5FC3E2BCAEBCF6BEF7C0DAB7E F31702E504446>

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

WWW PHP Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2

关于我 王宏江, 花名 : 宏江 Blog:h1p://hongjiang.info 经历 : Java : 10y+ Scala : 2y+ 十年工作经验,2009 年加入阿里, 曾在阿里巴巴中文站和 laiwang.com 担任架构师, 现在中间件 & 稳定性平台部门 Scala 布道者 业余马

2007 CS Part 05: (ONO, Kouichi)

第一部分:前言

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

<4D F736F F D AB4FA5C0A448ADFBA4FEAFC5C0B3C0CBB8EAAEC6B2C4A447B3A1A5F E646F63>

App Flappy Bird 14 STEP Swift GameKit Xcode 5.1 Swift GameKit MyWord

e bug 0 x=0 y=5/x 0 Return 4 2

python内存管理

PowerPoint プレゼンテーション

國家圖書館典藏電子全文

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


05 01 accordion UI containers 03 Accordion accordion UI accordion 54

Ctpu

Open topic Bellman-Ford算法与负环

ebook14-4

呐喊

C C

untitled

数据结构与算法 - Python基础

立法會工商事務委員會

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

万山红遍农业示范园草莓调查研究

chap07.key

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

ebook39-5

Fuzzy GP

untitled

Simulator By SunLingxi 2003

[1] (p.28) / / 3 4 [1] (p.26) [2] (p.171)

撰 寫 人 :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