Итак, давайте начнем с помощью кодирования два списка конструкторов, используя свой пример в качестве справки:
[] := λc. λn. n
[1,2,3] := λc. λn. c 1 (c 2 (c 3 n))
[]
конец списка конструктора, и мы можем поднять, что прямо из примера. []
уже имеет смысл в Haskell, так что давайте назовем наши nil
:
nil = \c n -> n
Другим конструктор нам нужны принимает элемент и существующий список, и создает новый список. Канонический, это называется cons
, с определением:
cons x xs = \c n -> c x (xs c n)
Мы можем проверить, что это согласуется с приведенным выше примером, так как
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)) =
Теперь рассмотрит назначение функции карты - это применить данную функцию к каждому элементу списка. Итак, давайте посмотрим, как это работает для каждого из конструкторов.
nil
не имеет элементов, поэтому mapChurch f nil
должно быть просто nil
:
mapChurch f nil
= \c n -> nil (c.f) n
= \c n -> (\c' n' -> n') (c.f) n
= \c n -> n
= nil
cons
имеет элемент и остальную часть списка, так что, для того, чтобы mapChurch f
работать Собственость, он должен применять f
к элементу и mapChurch f
для остальной части списка. То есть mapChurch f (cons x xs)
должен быть таким же, как 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)
Так, так как все списки сделаны из этих двух конструкторов и mapChurch
работает на обоих из них, как и ожидалось, mapChurch
должны работать, как ожидается, во всех списках.
страницы [Церковь кодирования] (https://secure.wikimedia.org/wikipedia/en/wiki/Church_encoding#List_encodings) на википедии, кажется, как хорошее место, чтобы начать из. –
@jcdmb: Вы изучаете информатику в KIT? –