Vì vậy, chúng ta hãy bắt đầu bằng cách mã hóa hai nhà xây dựng danh sách, sử dụng ví dụ của bạn như tài liệu tham khảo:
[] := λc. λn. n
[1,2,3] := λc. λn. c 1 (c 2 (c 3 n))
[]
là kết thúc của danh sách constructor, và chúng ta có thể nhấc rằng thẳng từ ví dụ. []
đã có ý nghĩa trong Haskell, vì vậy chúng ta hãy gọi chúng ta nil
:
nil = \c n -> n
Các constructor khác chúng ta cần có một yếu tố và một danh sách hiện có, và tạo ra một danh sách mới. Theo giáo luật, điều này được gọi là cons
, với định nghĩa:
cons x xs = \c n -> c x (xs c n)
Chúng tôi có thể kiểm tra điều này là phù hợp với ví dụ trên, kể từ
cons 1 (cons 2 (cons 3 nil))) =
cons 1 (cons 2 (cons 3 (\c n -> n)) =
cons 1 (cons 2 (\c n -> c 3 ((\c' n' -> n') c n))) =
cons 1 (cons 2 (\c n -> c 3 n)) =
cons 1 (\c n -> c 2 ((\c' n' -> c' 3 n') c n)) =
cons 1 (\c n -> c 2 (c 3 n)) =
\c n -> c 1 ((\c' n' -> c' 2 (c' 3 n')) c n) =
\c n -> c 1 (c 2 (c 3 n)) =
Bây giờ, hãy xem xét mục đích của chức năng bản đồ - đó là để áp dụng hàm đã cho cho mỗi phần tử của danh sách. Vì vậy, hãy xem cách hoạt động cho từng nhà xây dựng.
nil
không có các yếu tố, vì vậy mapChurch f nil
chỉ nên nil
:
mapChurch f nil
= \c n -> nil (c.f) n
= \c n -> (\c' n' -> n') (c.f) n
= \c n -> n
= nil
cons
có một yếu tố và một phần còn lại của danh sách, vì vậy, để cho mapChurch f
làm việc propery, nó phải áp dụng f
đến phần tử và mapChurch f
đến phần còn lại của danh sách. Tức là, mapChurch f (cons x xs)
phải giống như cons (f x) (mapChurch f xs)
.
mapChurch f (cons x xs)
= \c n -> (cons x xs) (c.f) n
= \c n -> (\c' n' -> c' x (xs c' n')) (c.f) n
= \c n -> (c.f) x (xs (c.f) n)
-- (c.f) x = c (f x) by definition of (.)
= \c n -> c (f x) (xs (c.f) n)
= \c n -> c (f x) ((\c' n' -> xs (c'.f) n') c n)
= \c n -> c (f x) ((mapChurch f xs) c n)
= cons (f x) (mapChurch f xs)
Vì vậy, kể từ khi tất cả danh sách được làm từ hai nhà thầu, và mapChurch
công trình trên cả hai như mong đợi, mapChurch
phải làm việc như mong đợi trên tất cả các danh sách.
Trang [Mã hóa Giáo hội] (https://secure.wikimedia.org/wikipedia/en/wiki/Church_encoding#List_encodings) trên wikipedia dường như là một nơi tốt để bắt đầu từ. –
@jcdmb: Bạn có nghiên cứu khoa học máy tính tại KIT không? –