12. スコットエンコーディングでのパター
ンマッチ
スコットエンコーディングでの定義
tail l = l Nil (λx xs. xs)
Nilと置換 Consと置換
パターンマッチを使った定義
tail l = case l of
Nil -> Nil
Cons x xs -> xs
13. スコットエンコーディングでの再帰
Haskell
length l = case l of
Nil -> 0
Cons x xs -> 1 + (length xs)
不動点コンビネータを使えば
きれいに翻訳できる スコットエンコーディング
+
不動点コンビネータ
length = Y (λ length. λ list. list
0
λ x xs. 1 + ((Y length) xs))
14. チャーチエンコーディング
(Chuch encoding)
② 全て
全て一括で置換する
Cons 10 (Cons 20 (Cons 30 Nil)
c 10 ( c 20 ( c 30 n )
15. リストのコンストラクタを全部置換す
る関数foldr
foldrの型
foldr :: X -> (a -> X -> X) -> List a -> X
Nilと置換する関数 Consと置換する関数
foldrの定義
foldr n c Nil = n
foldr n c (Cons x xs) = c x (foldr n c xs)
16. foldrで再帰関数を定義できる
再帰的定義
length l = case l of
Nil -> 0
Cons x xs -> 1 + (length xs)
foldrを使った定義
length = foldr 0 (λx n. 1 + n)
17. foldrで再帰関数を定義できる
再帰的定義
sum l = case l of
Nil -> 0
Cons x xs -> x + (sum xs)
foldrを使った定義
sum = foldr (+) 0
18. foldrで再帰関数を定義できる
再帰的定義
map f l = case l of
Nil -> Nil
Cons x xs -> Cons (f x) (map f xs)
foldrを使った定義
map f = foldr Nil (λx xs. Cons (f x) xs)
20. リストの値そのものにfoldrの機能
が組み込まれている
foldrの定義とnil,consの定義は,よく似ている
foldr n c Nil = n
nil = λn c. n
foldr n c (Cons x xs) = c x (foldr n c xs)
cons = λx xs. λn c. c x (xs n c)
21. チャーチ数 = チャーチエンコーディ
ングされた自然数
data Nat = Zero | Succ Nat
0 = Zero
1 = Succ Zero
2 = Succ (Succ Zero)
3 = Succ (Succ (Succ Zero))
zero = λs z. z
succ n = λs z. s (n s z)