9. 函數程式語
言: Haskell
基礎 Combinator
黃耀賢
起頭
(Beginning)
Lambda
Calculus • 如果一則 lambda 詞彙是封閉的,就是一個 combinator
有型態的
Lambda
。
Calculus
(Typed) • Identity combinator I ≡ λx. x。
Haskell 基礎 • K ≡ λxy . x。
(Basics)
小結 • K∗ ≡ λxy . y 。
(Subtitle)
參考文獻
• S ≡ λxyz. x z (y z)。
(Bibliography)
• Fixpoint combinator Y ≡ λf . (λx. f (x x)) (λx. f (x x)) 使
∀F . F (Y F ) = Y F 。
9 / 30
10. 函數程式語
言: Haskell
基礎 Reduction (簡化、約化)
黃耀賢
起頭
(Beginning)
Lambda
Calculus
• 令E 為構成一函數程式的式子,E 可以有一些改寫規則。
有型態的
Lambda Reduction 是將P,E 的一部份,根據改寫規則取代為另
Calculus
(Typed) 一個式子P ′ ,簡列為:
Haskell 基礎
(Basics) E [P] → E [P ′ ]
小結
(Subtitle) • 可 化 簡 的 式 子 : λ 開頭的式子和其他參數放在一起,如
參考文獻 (λv .M)N,就可以化簡。
(Bibliography)
• 例如: (λxy . s x y ) u v −→ s x y [x := u, y := v ] ≡ s u v
10 / 30
14. 函數程式語
言: Haskell
基礎 Call By Value
黃耀賢
起頭
(Beginning) • Call by value由最外邊的可化約式,並要先將參數化
Lambda
Calculus
約。
有型態的 • 例如:
Lambda
Calculus
(Typed)
Haskell 基礎
(Basics) id(id(λz.id z)) → id(λz.id z)
小結
(Subtitle)
→ λz.id z
參考文獻 →
(Bibliography)
• Call by value又稱為 strict evaluation。
• (λbfg . if b then f else g ) b f g 的化約不能做
call-by-value ,必須做 call-by-name 。
14 / 30
15. 函數程式語
言: Haskell
基礎 建立數字計算系統
黃耀賢
起頭
(Beginning)
Lambda
Calculus 1 定義 true ≡ K 和 false ≡ K∗ 。
有型態的
Lambda
2 定義選擇結構 [M, N] ≡ λz. z M N ,其中 z M N 表示
Calculus
(Typed)
if B then M else N。於是,
Haskell 基礎
[M, N] true = M
(Basics) [M, N] false = N
小結
(Subtitle) Proof.
參考文獻
(Bibliography)
[M, N] true ≡ (λz. z M N) (λxy . x)
= z M N[z := (λxy . x)] ≡ (λxy . x) M N
= x[x := M, y := N] ≡ M
15 / 30
16. 函數程式語
言: Haskell
基礎 建立數字計算系統(續)
黃耀賢
起頭
(Beginning) 3 遞迴定義數字,將每個自然數 n 的數字定義為 n :
Lambda
Calculus
0 =I
有型態的 n + 1 = [false, n ]
Lambda
Calculus 4 定義零和前後關係:
(Typed)
S+ n = n + 1
Haskell 基礎
(Basics) P− n + 1 = n
小結
(Subtitle)
Zero 0 = true
參考文獻
Zero n + 1 = false
(Bibliography)
Proof.
S+ ≡ λx. [false, x]
P− ≡ λx. x false
Zero ≡ λx. x true
16 / 30
17. 函數程式語
言: Haskell
基礎 建立數字計算系統(續)
黃耀賢
起頭
(Beginning)
Lambda
Calculus
• 想定義加法運算如
有型態的
Lambda Add(0, y) = y
Calculus
(Typed) Add(x+1, y) = 1+Add(x, y)
Haskell 基礎 • 意思和這個 lambda 詞彙相同:
(Basics)
小結
Add x y = if Zero x then y else S+ (Add (P− x) y )
(Subtitle)
• 用 Y combinator 製作遞迴:
參考文獻
(Bibliography)
Add ≡ Y(λaxy . if Zero x then y else S+ (a (P− x) y ))
17 / 30
18. 函數程式語
言: Haskell
基礎 簡單型態系統
黃耀賢
起頭 • 型態系統由 H. B. Curry 在 1934 年介紹,之後 1958 年
(Beginning)
和 1972 年做了一些改變,用自然的方式推導 lambda
Lambda
Calculus term 的型態。
有型態的
Lambda
• T 為型態的集合。
Calculus
(Typed) • 任何 lambda term M 都可以被指派為一個型態 σ ,只要
Haskell 基礎 σ ∈ T。
(Basics)
小結
• 函數套用:
(Subtitle) M:σ→τ N :σ
參考文獻
(Bibliography)
MN :τ
• 函數抽象化:
x:σ
.
.
.
M:τ
λx. M : σ → τ
18 / 30
22. 函數程式語
言: Haskell
基礎 自訂型態
黃耀賢
起頭
(Beginning)
Lambda
Calculus • 語法:
有型態的
Lambda
Calculus
data Type-constructor = Data-constructor s
(Typed)
• 定義「顏色」型態:
Haskell 基礎
(Basics) data Color = Red | Orange | Yellow
小結
(Subtitle)
| Green | Blue | Indigo | Violet
參考文獻 • 定義「點」型態:只有一個 data constructor ,必須參考
(Bibliography)
其他型態來建立型態。
data Point a = Pt a a
22 / 30
23. 函數程式語
言: Haskell
基礎 「樹」資料結構
黃耀賢
起頭
(Beginning) • data Tree a = Leaf a | Branch (Tree a) (Tree a)
Lambda
Calculus • flatten :: Tree a -> [a]
有型態的 flatten (Leaf x) = [x]
Lambda
Calculus flatten (Branch x y) = flatten x ++ flatten y
(Typed)
• 練習:
Haskell 基礎
(Basics) 1 將上述「樹」展平程式打字輸入在文字檔 test.hs ,存檔。
小結 2 確定 GHC 已安裝。
(Subtitle) 3 在命令列模式視窗中,切換到 test.hs 所存放位置,執行 ghci
參考文獻 。
(Bibliography)
4 在 GHCi 環境輸入 :l test.hs 載入程式。若回應錯誤訊息請
檢查程式碼。
5 在 GHCi 環境輸入 flatten (Branch (Branch (Leaf ’a’)
(Leaf ’b’)) (Leaf ’c’)) 並觀察結果。
6 在 GHCi 環境輸入 :q 關閉 GHCi 環境。
23 / 30
24. 函數程式語
言: Haskell
基礎 效能瓶頸
黃耀賢
起頭
(Beginning)
Lambda
Calculus
• (++) :: [a] -> [a] -> [a]
有型態的
Lambda []++ys = ys
Calculus
(Typed) (x:xs)++ys = x:(xs++ys)
Haskell 基礎 • data Tree a = Leaf a | Branch (Tree a) (Tree a)
(Basics)
小結 • flatten :: Tree a -> [a]
(Subtitle)
flatten (Leaf x) = [x]
參考文獻
(Bibliography) flatten (Branch x y) = flatten x ++ flatten y
• 計算複雜度是 O 2 。
24 / 30
30. 函數程式語
言: Haskell
基礎 參考文獻
黃耀賢
起頭
(Beginning)
Lambda
Calculus
1 Benjamin C. Pierce. Types and Programming Language. MIT, 2002.
有型態的 2 Graham Hutton. Programming in Haskell. Cambridge, 2007.
Lambda
Calculus 3 Henk Barendregt and Erik Barendsen. Introduction to Lambda
(Typed) Calculus. [Online] Available:
Haskell 基礎 ftp://ftp.cs.kun.nl/pub/CompMath.Found/lambda.pdf (Oct, 2008).
(Basics)
4 Hal Daum´ III. Yet another Haskell tutorial. [Online] Available:
e
小結
(Subtitle) http://www.cs.utah.edu/ hal/docs/daume02yaht.pdf (Oct, 2008).
參考文獻 5 Paul Hudak, John Peterson, and Joseph Fasel. A gentle introduction
(Bibliography)
to Haskell: Version 98. [Online] Available:
http://www.haskell.org/tutorial/ (Oct, 2008).
30 / 30