SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
函數程式語
言: Haskell
   基礎

    黃耀賢


起頭
(Beginning)

Lambda
Calculus
                 函數程式語言: Haskell 基礎
有型態的
Lambda
Calculus
(Typed)                     黃耀賢
Haskell 基礎
(Basics)

小結
(Subtitle)
                    edward@tc.program.com.tw
參考文獻                    微程式技術研討會
(Bibliography)
                        October 22, 2008




                                               1 / 30
函數程式語
言: Haskell
   基礎                                             Outline
    黃耀賢


起頭
(Beginning)
                 1 起頭 (Beginning)
Lambda
Calculus

有型態的
Lambda
                 2 Lambda Calculus
Calculus
(Typed)

Haskell 基礎       3 有型態的 Lambda Calculus (Typed)
(Basics)

小結
(Subtitle)       4 Haskell 基礎 (Basics)
參考文獻
(Bibliography)
                 5 小結 (Subtitle)

                 6 參考文獻 (Bibliography)




                                                            2 / 30
函數程式語
言: Haskell
   基礎                                           Leibniz 的理想
    黃耀賢


起頭
(Beginning)

Lambda
Calculus
                 1   通用語言:創造一種語言,使能描述各種問題。
有型態的
Lambda               Frege 和 Russell 等數學家,以初階述語邏輯所描述的集
Calculus
(Typed)              合論形式解決。
Haskell 基礎
(Basics)
                 2   決策問題:找到一種決策法,將所有以通用語言描述的
小結                   問題解決。
(Subtitle)
                     為一哲學問題:「能夠以通用語言解答所有難題嗎?」,號稱為
參考文獻
(Bibliography)       Entscheidungsproblem /Entquot;S2IdUNspô6bl@m/ (德語,意為「決策問
                     題」)。




                                                                             3 / 30
函數程式語
言: Haskell
   基礎                         Entscheidungsproblem 求解
    黃耀賢


起頭
(Beginning)

Lambda
Calculus
                 同時由 Church 與 Turing 各自證為否定。為了證明,需要下
有型態的
Lambda           列工具
Calculus
(Typed)           • Lambda calculus:Alonzo Church 在 1936 年發明的正式
Haskell 基礎         系統,並定義可執行函數的標記法。
(Basics)

小結                • Turing machines:Alan Turing 在 1936 年 7 月發明的機
(Subtitle)
                   器類型,並定義可執行函數的標記法。
參考文獻
(Bibliography)     同年,Turing 證明二種模型有同樣強度,是由於定義了相同的可執
                   行函數。




                                                               4 / 30
函數程式語
言: Haskell
   基礎                                    Turing machines 的發展
    黃耀賢


起頭
(Beginning)

Lambda
Calculus

有型態的
Lambda
Calculus
(Typed)

Haskell 基礎
(Basics)

小結
(Subtitle)
                              Figure: Turing Machine 的藝術式圖現。1
參考文獻
(Bibliography)


                 • Von Neumann 計算機以 Turing machine 概念為基礎。
                 • 命令程式語言,包括組合語言、 Fortran 、 Pascal 等等
                      都根據 Turing machine 接受指令的方式而出現。

                 1
                     圖摘自 http://en.wikipedia.org/wiki/Turing machine gallery
                                                                               5 / 30
函數程式語
言: Haskell
   基礎                            Lambda calculus 的發展
    黃耀賢


起頭
(Beginning)

Lambda
Calculus         • Alonzo Church 在 1936 年提出 lambda calculus 正式系
有型態的
Lambda            統,並定義可執行函數的標記法。
Calculus
(Typed)          • Haskell Brookes Curry 和 Alonzo Church 先後在 1934 年
Haskell 基礎        和 1940 年介紹有型態的 lambda calculus 。
(Basics)

小結               • 函數程式語言,包括 Miranda 、 ML 、 Haskell 等等都
(Subtitle)
                  根據 lambda calculus 而出現。
參考文獻
(Bibliography)   • Lisp 是較早期的例子,但混雜一些其他概念。
                 • Reduction machines 由函數程式的執行而出現。




                                                                  6 / 30
函數程式語
言: Haskell
   基礎                                            算式的構成
    黃耀賢


起頭
(Beginning)
                 • Lambda calculus 的算式都表達為函數,由 Lambda
Lambda            Term (lambda 詞彙) 構成。
Calculus
                 • 任意變數就是 lambda term 。
有型態的
Lambda            例如: x
Calculus
(Typed)               x′
Haskell 基礎
(Basics)
                 • 一些 lambda term 放在一起,也是 lambda term。
小結                例如: x x ′
(Subtitle)
                      (x x ′ ) y z
參考文獻
(Bibliography)   • 以“λ 變 數 . lambda term”格式構成的詞彙,也是
                  lambda term。
                  例如: λx. x           (lambda abstraction , lambda 抽象
                  化)
                         λx y . x y


                                                                        7 / 30
函數程式語
言: Haskell
   基礎                                    算式的性質
    黃耀賢


起頭
(Beginning)

Lambda           • 範圍: “λ x. M”格式的 lambda term ,存在於 M 中的 x
Calculus
                  都是「受限制的」(bound)。例如:
有型態的
Lambda                 x ((λx. x + 1)y ) z ′
Calculus
(Typed)           x 是受 限 制 的 變 數 。
                     受
Haskell 基礎
(Basics)
                 • 不受限制的變數稱為自 由 變 數 (free variable)。
                            自
小結               • 封 閉 的 lambda 詞 彙 :若一則 lambda 詞彙中沒有自由
(Subtitle)

參考文獻
                  變數(意思是所有的變數都受限制),是封閉 lambda
(Bibliography)    詞彙(closed λ term)。
                 • 不是封閉 lambda 詞彙的,是開 放 的 lambda 詞 彙 (open
                                    開
                  λ term)。




                                                         8 / 30
函數程式語
言: 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
函數程式語
言: 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
函數程式語
言: Haskell
   基礎                       完全化約 (Full Reduction)
    黃耀賢


起頭
(Beginning)

Lambda
Calculus
                 • 完 全 化 約 (full reduction)任何可化簡的式子可在任何時
有型態的              候化簡。
Lambda
Calculus         • 例如:
(Typed)

Haskell 基礎
(Basics)

小結                         id(id(λz.id z)) → id(λz.id z)
(Subtitle)

參考文獻
                                          → id(λz.z)
(Bibliography)
                                          → λz.z
                                          →




                                                           11 / 30
函數程式語
言: Haskell
   基礎                 一般化約 (Normal Order Strategy
    黃耀賢
                                      Reduction)
起頭
(Beginning)

Lambda
Calculus
                 • 一 般 化 約 (normal order strategy)最外邊、最左邊的可
有型態的
Lambda
Calculus
                  化簡式先化簡。
(Typed)
                 • 例如:
Haskell 基礎
(Basics)

小結
(Subtitle)
                            id(id(λz.id z)) → id(λz.id z)
參考文獻
(Bibliography)                             → λz.id z
                                           → λz.z
                                           →




                                                            12 / 30
函數程式語
言: Haskell
   基礎                                        Call By Name
    黃耀賢


起頭
(Beginning)      • Call by name較嚴格,不容許在抽象化的 lambda 詞
Lambda            彙(即 λ 開頭的 lambda 詞彙)中做化約。
Calculus

有型態的
                 • 例如:
Lambda
Calculus
(Typed)

Haskell 基礎                   id(id(λz.id z)) → id(λz.id z)
(Basics)

小結                                          → λz.id z
(Subtitle)
                                            →
參考文獻
(Bibliography)
                 • Call by name又稱為 lazy evaluation。
                 • Haskell採用優化的 lazy evaluation,所有相同的 lambda
                  詞彙,第一個已經化簡的就儲存起來,後續的詞彙直接
                  參考第一個化簡的結果,而節省重複的化簡動作。


                                                             13 / 30
函數程式語
言: 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
函數程式語
言: 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
函數程式語
言: 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
函數程式語
言: 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
函數程式語
言: 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
函數程式語
言: Haskell
   基礎                                            Haskell 簡介
    黃耀賢


起頭
(Beginning)

Lambda
Calculus

有型態的               1   發明於 1987 年,以 Haskell Brookes Curry 為名。
Lambda
Calculus           2   Haskell 98 標準之後,舊版語言已拋棄。
(Typed)

Haskell 基礎         3   Haskell 是有 型 態 的函 數 式 程式語言。
                                有      函
(Basics)

小結
                   4   以 standard prelude 為預設標準函式庫。
(Subtitle)
                   5   有關資訊請參考 http://haskell.org 。2
參考文獻
(Bibliography)




                   2
                   http://haskell.org/ghc 為 GHC (一種 Haskell 98 的實作) 發佈的
                 網站,提供了 Windows 、 Linux 、 Solaris 和 Mac OS 版本的安裝程式。
                                                                     19 / 30
函數程式語
言: Haskell
   基礎                             資料值 (Value) 和型態
    黃耀賢


起頭
(Beginning)

Lambda
Calculus         • Haskell 預設下列資料型態:
有型態的                 • 5 :: Integer
Lambda
Calculus             • ’K’ :: Char
(Typed)              • False :: Bool
Haskell 基礎           • [3,2,1] :: [Integer]
(Basics)
                     • (’b’, True) :: (Char, Bool)
小結
(Subtitle)           • id :: a -> a
參考文獻                   id x = x
(Bibliography)
                 • 測 定 型 態 (Typing):“:: Type ” 是「有· · · 型態」的意
                  思,會做型態的建立和檢查。




                                                                20 / 30
函數程式語
言: Haskell
   基礎                                       基本型態
    黃耀賢
                 • Bool
起頭
(Beginning)      • Char:用單引號圍起的字母。
Lambda           • String:即一列 Char 資料,用雙引號圍起的許多字
Calculus

有型態的
                     母。 ”Hello” 就是 [’H’,’e’,’l’,’l’,’o’] 。
Lambda
Calculus
                 •   Int:固定精確度的整數,值介 −231 ∼ 231 − 1 之間。
(Typed)
                 •   Integer:任意精確度的整數。
Haskell 基礎
(Basics)         •   Float:單精確度的浮點數。
小結
(Subtitle)
                 •   List 型態:用方括號包含型態標記為指定型態,構成 list
參考文獻                 型態。 [Int] 是整數型態的 list 型態。
(Bibliography)
                 •   Tuple 型態:用圓括號包含逗點分隔的多個型態,構成
                     tuple 型態。 (Int, Int) 是一對整數型態的 tuple 型
                     態。
                 •   函數型態:用 -> 箭頭連接多個型態,構成函數型態。
                     Int -> Int 是從一個整數型態對應到另一個整數型態
                     的函數型態。
                                                        21 / 30
函數程式語
言: 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
函數程式語
言: 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
函數程式語
言: 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
函數程式語
言: Haskell
   基礎                                     減少 ++ 的計算量
    黃耀賢


起頭
(Beginning)

Lambda           • 利用累 積 變 數 (accumulating argument)減少 ++ 的計
                     累
Calculus

有型態的
                   算量。
Lambda
Calculus         • 令 flatten′ t acc = flatten t ++ acc ,
(Typed)

Haskell 基礎
                 • flatten′ (Leaf x) acc
(Basics)           = { 由 flatten′ 的定義, }
小結
(Subtitle)
                       flatten (Leaf x) ++ acc
參考文獻
                   = { 套用 flatten }
(Bibliography)
                       [x] ++ acc
                   = { 套用 ++ }
                       x:acc




                                                           25 / 30
函數程式語
言: Haskell
   基礎                                減少 ++ 的計算量(續)
    黃耀賢


起頭
(Beginning)

Lambda           • flatten′ (Tree x y) acc
Calculus
                   = { 由 flatten′ 的定義 }
有型態的
Lambda                 flatten (Tree x y) ++ acc
Calculus
(Typed)            = { 套用 flatten }
Haskell 基礎             (flatten x ++ flatten y) ++ acc
(Basics)
                   = { 由 ++ 的結合律 }
小結
(Subtitle)             flatten x ++ (flatten y ++ acc)
參考文獻               = { 將 x 歸納 }
(Bibliography)
                       flatten′ x (flatten y ++ acc)
                   = { 將 y 歸納 }
                       flatten′ x (flatten′ y acc)




                                                       26 / 30
函數程式語
言: Haskell
   基礎                               減少 ++ 的計算量(末)
    黃耀賢


起頭
(Beginning)

Lambda
Calculus

有型態的
Lambda
Calculus         • 於是,
(Typed)

Haskell 基礎
                  flatten′ :: Tree a -> [a] -> [a]
(Basics)
                  flatten′ (Leaf x) acc = x:acc
小結
(Subtitle)
                  flatten′ (Tree x y) acc = flatten′ x (flatten′ y acc)
參考文獻
(Bibliography)




                                                                       27 / 30
函數程式語
言: Haskell
   基礎                                         小結和摘要
    黃耀賢


起頭
(Beginning)
                 本次討論,我們知道了:
Lambda            • 函數語言的源頭是 lambda calculus ,相對於命令式語言
Calculus
                   的源頭是 Turing machines.
有型態的
Lambda
Calculus
                  • Lambda calculus 定義了詞彙的構成與化簡規則。藉此可
(Typed)
                   以建立數學計算系統。
Haskell 基礎
(Basics)          • Lambda 詞彙可以附加型態,並有合理的型態推導規
小結                 則。
(Subtitle)

參考文獻              • Lambda calculus 的化簡有幾種策略,包括完全化簡、一
(Bibliography)
                   般化簡、 call-by-name 和 call-by-value 。
                  • Haskell 是有型態的函數語言。從基本的資料值開始,每
                   個詞彙都可以合理地推導型態。
                  • Haskell 容許以關鍵字 data 自訂型態。


                                                         28 / 30
函數程式語
言: Haskell
   基礎                                         將來的內容
    黃耀賢


起頭
(Beginning)

Lambda           將來會談論的項目有:
Calculus
                  • 運算元。
有型態的
Lambda
Calculus
                  • 類別。
(Typed)
                  • Haskell 的標準函式庫 (standard prelude) 。
Haskell 基礎
(Basics)
                  • 以 lambda 詞彙方式撰寫 Haskell 程式。
小結
(Subtitle)        • 以數學方式撰寫 Haskell 程式。
參考文獻
(Bibliography)
                  • 區域變數。
                  • 高階函數。
                  • 輸入和輸出。




                                                          29 / 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

Contenu connexe

Similaire à Haskell Foundations (13)

Ontology-based Content Management System (ICIM 2008)
Ontology-based Content Management System (ICIM 2008)Ontology-based Content Management System (ICIM 2008)
Ontology-based Content Management System (ICIM 2008)
 
Why CouchDB
Why CouchDBWhy CouchDB
Why CouchDB
 
Search Psychology
Search PsychologySearch Psychology
Search Psychology
 
Out-002-Suc3rum-20090720
Out-002-Suc3rum-20090720Out-002-Suc3rum-20090720
Out-002-Suc3rum-20090720
 
WindowsユーザのためのはじめてのPerlプログラミング
WindowsユーザのためのはじめてのPerlプログラミングWindowsユーザのためのはじめてのPerlプログラミング
WindowsユーザのためのはじめてのPerlプログラミング
 
Ruby on Rails Tutorial Part I
Ruby on Rails Tutorial Part IRuby on Rails Tutorial Part I
Ruby on Rails Tutorial Part I
 
Gorm @ gopher china
Gorm @ gopher chinaGorm @ gopher china
Gorm @ gopher china
 
書後卡的小社會網路
書後卡的小社會網路書後卡的小社會網路
書後卡的小社會網路
 
Reloaded
ReloadedReloaded
Reloaded
 
Why Ror
Why RorWhy Ror
Why Ror
 
P2 P Mobile Advertising And Targeting
P2 P Mobile Advertising And TargetingP2 P Mobile Advertising And Targeting
P2 P Mobile Advertising And Targeting
 
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PostgreSQLで学ぶBoyer-Moore-HorspoolアルゴリズムPostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
PostgreSQLで学ぶBoyer-Moore-Horspoolアルゴリズム
 
1242626441API2 upload
1242626441API2 upload1242626441API2 upload
1242626441API2 upload
 

Dernier

An Overview of Mutual Funds Bcom Project.pdf
An Overview of Mutual Funds Bcom Project.pdfAn Overview of Mutual Funds Bcom Project.pdf
An Overview of Mutual Funds Bcom Project.pdf
SanaAli374401
 
Beyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global ImpactBeyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global Impact
PECB
 
Making and Justifying Mathematical Decisions.pdf
Making and Justifying Mathematical Decisions.pdfMaking and Justifying Mathematical Decisions.pdf
Making and Justifying Mathematical Decisions.pdf
Chris Hunter
 

Dernier (20)

Application orientated numerical on hev.ppt
Application orientated numerical on hev.pptApplication orientated numerical on hev.ppt
Application orientated numerical on hev.ppt
 
Advance Mobile Application Development class 07
Advance Mobile Application Development class 07Advance Mobile Application Development class 07
Advance Mobile Application Development class 07
 
fourth grading exam for kindergarten in writing
fourth grading exam for kindergarten in writingfourth grading exam for kindergarten in writing
fourth grading exam for kindergarten in writing
 
Unit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptxUnit-IV- Pharma. Marketing Channels.pptx
Unit-IV- Pharma. Marketing Channels.pptx
 
PROCESS RECORDING FORMAT.docx
PROCESS      RECORDING        FORMAT.docxPROCESS      RECORDING        FORMAT.docx
PROCESS RECORDING FORMAT.docx
 
Unit-V; Pricing (Pharma Marketing Management).pptx
Unit-V; Pricing (Pharma Marketing Management).pptxUnit-V; Pricing (Pharma Marketing Management).pptx
Unit-V; Pricing (Pharma Marketing Management).pptx
 
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
Presentation by Andreas Schleicher Tackling the School Absenteeism Crisis 30 ...
 
This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.
 
Ecological Succession. ( ECOSYSTEM, B. Pharmacy, 1st Year, Sem-II, Environmen...
Ecological Succession. ( ECOSYSTEM, B. Pharmacy, 1st Year, Sem-II, Environmen...Ecological Succession. ( ECOSYSTEM, B. Pharmacy, 1st Year, Sem-II, Environmen...
Ecological Succession. ( ECOSYSTEM, B. Pharmacy, 1st Year, Sem-II, Environmen...
 
An Overview of Mutual Funds Bcom Project.pdf
An Overview of Mutual Funds Bcom Project.pdfAn Overview of Mutual Funds Bcom Project.pdf
An Overview of Mutual Funds Bcom Project.pdf
 
Measures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and ModeMeasures of Central Tendency: Mean, Median and Mode
Measures of Central Tendency: Mean, Median and Mode
 
Key note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdfKey note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdf
 
How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17How to Give a Domain for a Field in Odoo 17
How to Give a Domain for a Field in Odoo 17
 
Mattingly "AI & Prompt Design: The Basics of Prompt Design"
Mattingly "AI & Prompt Design: The Basics of Prompt Design"Mattingly "AI & Prompt Design: The Basics of Prompt Design"
Mattingly "AI & Prompt Design: The Basics of Prompt Design"
 
microwave assisted reaction. General introduction
microwave assisted reaction. General introductionmicrowave assisted reaction. General introduction
microwave assisted reaction. General introduction
 
Beyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global ImpactBeyond the EU: DORA and NIS 2 Directive's Global Impact
Beyond the EU: DORA and NIS 2 Directive's Global Impact
 
psychiatric nursing HISTORY COLLECTION .docx
psychiatric  nursing HISTORY  COLLECTION  .docxpsychiatric  nursing HISTORY  COLLECTION  .docx
psychiatric nursing HISTORY COLLECTION .docx
 
Paris 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activityParis 2024 Olympic Geographies - an activity
Paris 2024 Olympic Geographies - an activity
 
Making and Justifying Mathematical Decisions.pdf
Making and Justifying Mathematical Decisions.pdfMaking and Justifying Mathematical Decisions.pdf
Making and Justifying Mathematical Decisions.pdf
 
Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17Advanced Views - Calendar View in Odoo 17
Advanced Views - Calendar View in Odoo 17
 

Haskell Foundations

  • 1. 函數程式語 言: Haskell 基礎 黃耀賢 起頭 (Beginning) Lambda Calculus 函數程式語言: Haskell 基礎 有型態的 Lambda Calculus (Typed) 黃耀賢 Haskell 基礎 (Basics) 小結 (Subtitle) edward@tc.program.com.tw 參考文獻 微程式技術研討會 (Bibliography) October 22, 2008 1 / 30
  • 2. 函數程式語 言: Haskell 基礎 Outline 黃耀賢 起頭 (Beginning) 1 起頭 (Beginning) Lambda Calculus 有型態的 Lambda 2 Lambda Calculus Calculus (Typed) Haskell 基礎 3 有型態的 Lambda Calculus (Typed) (Basics) 小結 (Subtitle) 4 Haskell 基礎 (Basics) 參考文獻 (Bibliography) 5 小結 (Subtitle) 6 參考文獻 (Bibliography) 2 / 30
  • 3. 函數程式語 言: Haskell 基礎 Leibniz 的理想 黃耀賢 起頭 (Beginning) Lambda Calculus 1 通用語言:創造一種語言,使能描述各種問題。 有型態的 Lambda Frege 和 Russell 等數學家,以初階述語邏輯所描述的集 Calculus (Typed) 合論形式解決。 Haskell 基礎 (Basics) 2 決策問題:找到一種決策法,將所有以通用語言描述的 小結 問題解決。 (Subtitle) 為一哲學問題:「能夠以通用語言解答所有難題嗎?」,號稱為 參考文獻 (Bibliography) Entscheidungsproblem /Entquot;S2IdUNspô6bl@m/ (德語,意為「決策問 題」)。 3 / 30
  • 4. 函數程式語 言: Haskell 基礎 Entscheidungsproblem 求解 黃耀賢 起頭 (Beginning) Lambda Calculus 同時由 Church 與 Turing 各自證為否定。為了證明,需要下 有型態的 Lambda 列工具 Calculus (Typed) • Lambda calculus:Alonzo Church 在 1936 年發明的正式 Haskell 基礎 系統,並定義可執行函數的標記法。 (Basics) 小結 • Turing machines:Alan Turing 在 1936 年 7 月發明的機 (Subtitle) 器類型,並定義可執行函數的標記法。 參考文獻 (Bibliography) 同年,Turing 證明二種模型有同樣強度,是由於定義了相同的可執 行函數。 4 / 30
  • 5. 函數程式語 言: Haskell 基礎 Turing machines 的發展 黃耀賢 起頭 (Beginning) Lambda Calculus 有型態的 Lambda Calculus (Typed) Haskell 基礎 (Basics) 小結 (Subtitle) Figure: Turing Machine 的藝術式圖現。1 參考文獻 (Bibliography) • Von Neumann 計算機以 Turing machine 概念為基礎。 • 命令程式語言,包括組合語言、 Fortran 、 Pascal 等等 都根據 Turing machine 接受指令的方式而出現。 1 圖摘自 http://en.wikipedia.org/wiki/Turing machine gallery 5 / 30
  • 6. 函數程式語 言: Haskell 基礎 Lambda calculus 的發展 黃耀賢 起頭 (Beginning) Lambda Calculus • Alonzo Church 在 1936 年提出 lambda calculus 正式系 有型態的 Lambda 統,並定義可執行函數的標記法。 Calculus (Typed) • Haskell Brookes Curry 和 Alonzo Church 先後在 1934 年 Haskell 基礎 和 1940 年介紹有型態的 lambda calculus 。 (Basics) 小結 • 函數程式語言,包括 Miranda 、 ML 、 Haskell 等等都 (Subtitle) 根據 lambda calculus 而出現。 參考文獻 (Bibliography) • Lisp 是較早期的例子,但混雜一些其他概念。 • Reduction machines 由函數程式的執行而出現。 6 / 30
  • 7. 函數程式語 言: Haskell 基礎 算式的構成 黃耀賢 起頭 (Beginning) • Lambda calculus 的算式都表達為函數,由 Lambda Lambda Term (lambda 詞彙) 構成。 Calculus • 任意變數就是 lambda term 。 有型態的 Lambda 例如: x Calculus (Typed) x′ Haskell 基礎 (Basics) • 一些 lambda term 放在一起,也是 lambda term。 小結 例如: x x ′ (Subtitle) (x x ′ ) y z 參考文獻 (Bibliography) • 以“λ 變 數 . lambda term”格式構成的詞彙,也是 lambda term。 例如: λx. x (lambda abstraction , lambda 抽象 化) λx y . x y 7 / 30
  • 8. 函數程式語 言: Haskell 基礎 算式的性質 黃耀賢 起頭 (Beginning) Lambda • 範圍: “λ x. M”格式的 lambda term ,存在於 M 中的 x Calculus 都是「受限制的」(bound)。例如: 有型態的 Lambda x ((λx. x + 1)y ) z ′ Calculus (Typed) x 是受 限 制 的 變 數 。 受 Haskell 基礎 (Basics) • 不受限制的變數稱為自 由 變 數 (free variable)。 自 小結 • 封 閉 的 lambda 詞 彙 :若一則 lambda 詞彙中沒有自由 (Subtitle) 參考文獻 變數(意思是所有的變數都受限制),是封閉 lambda (Bibliography) 詞彙(closed λ term)。 • 不是封閉 lambda 詞彙的,是開 放 的 lambda 詞 彙 (open 開 λ term)。 8 / 30
  • 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
  • 11. 函數程式語 言: Haskell 基礎 完全化約 (Full Reduction) 黃耀賢 起頭 (Beginning) Lambda Calculus • 完 全 化 約 (full reduction)任何可化簡的式子可在任何時 有型態的 候化簡。 Lambda Calculus • 例如: (Typed) Haskell 基礎 (Basics) 小結 id(id(λz.id z)) → id(λz.id z) (Subtitle) 參考文獻 → id(λz.z) (Bibliography) → λz.z → 11 / 30
  • 12. 函數程式語 言: Haskell 基礎 一般化約 (Normal Order Strategy 黃耀賢 Reduction) 起頭 (Beginning) Lambda Calculus • 一 般 化 約 (normal order strategy)最外邊、最左邊的可 有型態的 Lambda Calculus 化簡式先化簡。 (Typed) • 例如: Haskell 基礎 (Basics) 小結 (Subtitle) id(id(λz.id z)) → id(λz.id z) 參考文獻 (Bibliography) → λz.id z → λz.z → 12 / 30
  • 13. 函數程式語 言: Haskell 基礎 Call By Name 黃耀賢 起頭 (Beginning) • Call by name較嚴格,不容許在抽象化的 lambda 詞 Lambda 彙(即 λ 開頭的 lambda 詞彙)中做化約。 Calculus 有型態的 • 例如: Lambda Calculus (Typed) Haskell 基礎 id(id(λz.id z)) → id(λz.id z) (Basics) 小結 → λz.id z (Subtitle) → 參考文獻 (Bibliography) • Call by name又稱為 lazy evaluation。 • Haskell採用優化的 lazy evaluation,所有相同的 lambda 詞彙,第一個已經化簡的就儲存起來,後續的詞彙直接 參考第一個化簡的結果,而節省重複的化簡動作。 13 / 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
  • 19. 函數程式語 言: Haskell 基礎 Haskell 簡介 黃耀賢 起頭 (Beginning) Lambda Calculus 有型態的 1 發明於 1987 年,以 Haskell Brookes Curry 為名。 Lambda Calculus 2 Haskell 98 標準之後,舊版語言已拋棄。 (Typed) Haskell 基礎 3 Haskell 是有 型 態 的函 數 式 程式語言。 有 函 (Basics) 小結 4 以 standard prelude 為預設標準函式庫。 (Subtitle) 5 有關資訊請參考 http://haskell.org 。2 參考文獻 (Bibliography) 2 http://haskell.org/ghc 為 GHC (一種 Haskell 98 的實作) 發佈的 網站,提供了 Windows 、 Linux 、 Solaris 和 Mac OS 版本的安裝程式。 19 / 30
  • 20. 函數程式語 言: Haskell 基礎 資料值 (Value) 和型態 黃耀賢 起頭 (Beginning) Lambda Calculus • Haskell 預設下列資料型態: 有型態的 • 5 :: Integer Lambda Calculus • ’K’ :: Char (Typed) • False :: Bool Haskell 基礎 • [3,2,1] :: [Integer] (Basics) • (’b’, True) :: (Char, Bool) 小結 (Subtitle) • id :: a -> a 參考文獻 id x = x (Bibliography) • 測 定 型 態 (Typing):“:: Type ” 是「有· · · 型態」的意 思,會做型態的建立和檢查。 20 / 30
  • 21. 函數程式語 言: Haskell 基礎 基本型態 黃耀賢 • Bool 起頭 (Beginning) • Char:用單引號圍起的字母。 Lambda • String:即一列 Char 資料,用雙引號圍起的許多字 Calculus 有型態的 母。 ”Hello” 就是 [’H’,’e’,’l’,’l’,’o’] 。 Lambda Calculus • Int:固定精確度的整數,值介 −231 ∼ 231 − 1 之間。 (Typed) • Integer:任意精確度的整數。 Haskell 基礎 (Basics) • Float:單精確度的浮點數。 小結 (Subtitle) • List 型態:用方括號包含型態標記為指定型態,構成 list 參考文獻 型態。 [Int] 是整數型態的 list 型態。 (Bibliography) • Tuple 型態:用圓括號包含逗點分隔的多個型態,構成 tuple 型態。 (Int, Int) 是一對整數型態的 tuple 型 態。 • 函數型態:用 -> 箭頭連接多個型態,構成函數型態。 Int -> Int 是從一個整數型態對應到另一個整數型態 的函數型態。 21 / 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
  • 25. 函數程式語 言: Haskell 基礎 減少 ++ 的計算量 黃耀賢 起頭 (Beginning) Lambda • 利用累 積 變 數 (accumulating argument)減少 ++ 的計 累 Calculus 有型態的 算量。 Lambda Calculus • 令 flatten′ t acc = flatten t ++ acc , (Typed) Haskell 基礎 • flatten′ (Leaf x) acc (Basics) = { 由 flatten′ 的定義, } 小結 (Subtitle) flatten (Leaf x) ++ acc 參考文獻 = { 套用 flatten } (Bibliography) [x] ++ acc = { 套用 ++ } x:acc 25 / 30
  • 26. 函數程式語 言: Haskell 基礎 減少 ++ 的計算量(續) 黃耀賢 起頭 (Beginning) Lambda • flatten′ (Tree x y) acc Calculus = { 由 flatten′ 的定義 } 有型態的 Lambda flatten (Tree x y) ++ acc Calculus (Typed) = { 套用 flatten } Haskell 基礎 (flatten x ++ flatten y) ++ acc (Basics) = { 由 ++ 的結合律 } 小結 (Subtitle) flatten x ++ (flatten y ++ acc) 參考文獻 = { 將 x 歸納 } (Bibliography) flatten′ x (flatten y ++ acc) = { 將 y 歸納 } flatten′ x (flatten′ y acc) 26 / 30
  • 27. 函數程式語 言: Haskell 基礎 減少 ++ 的計算量(末) 黃耀賢 起頭 (Beginning) Lambda Calculus 有型態的 Lambda Calculus • 於是, (Typed) Haskell 基礎 flatten′ :: Tree a -> [a] -> [a] (Basics) flatten′ (Leaf x) acc = x:acc 小結 (Subtitle) flatten′ (Tree x y) acc = flatten′ x (flatten′ y acc) 參考文獻 (Bibliography) 27 / 30
  • 28. 函數程式語 言: Haskell 基礎 小結和摘要 黃耀賢 起頭 (Beginning) 本次討論,我們知道了: Lambda • 函數語言的源頭是 lambda calculus ,相對於命令式語言 Calculus 的源頭是 Turing machines. 有型態的 Lambda Calculus • Lambda calculus 定義了詞彙的構成與化簡規則。藉此可 (Typed) 以建立數學計算系統。 Haskell 基礎 (Basics) • Lambda 詞彙可以附加型態,並有合理的型態推導規 小結 則。 (Subtitle) 參考文獻 • Lambda calculus 的化簡有幾種策略,包括完全化簡、一 (Bibliography) 般化簡、 call-by-name 和 call-by-value 。 • Haskell 是有型態的函數語言。從基本的資料值開始,每 個詞彙都可以合理地推導型態。 • Haskell 容許以關鍵字 data 自訂型態。 28 / 30
  • 29. 函數程式語 言: Haskell 基礎 將來的內容 黃耀賢 起頭 (Beginning) Lambda 將來會談論的項目有: Calculus • 運算元。 有型態的 Lambda Calculus • 類別。 (Typed) • Haskell 的標準函式庫 (standard prelude) 。 Haskell 基礎 (Basics) • 以 lambda 詞彙方式撰寫 Haskell 程式。 小結 (Subtitle) • 以數學方式撰寫 Haskell 程式。 參考文獻 (Bibliography) • 區域變數。 • 高階函數。 • 輸入和輸出。 29 / 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