Cóż, możemy komentować typu Churchlist w ten sposób, aby je wyjaśnić:
-- Tell me...
type Churchlist t u = (t -> u -> u) -- ...how to handle a pair
-> u -- ...and how to handle an empty list
-> u -- ...and then I'll transform a list into
-- the type you want
pamiętać, że jest ściśle związany z foldr
funkcję:
foldr :: (t -> u -> u) -> u -> [t] -> u
foldr k z [] = z
foldr k z (x:xs) = k x (foldr k z xs)
foldr
jest bardzo ogólna funkcja może implementować wszystkie rodzaje innych funkcji list. Trywialny przykład, który pomoże Ci realizuje liście kopiowania z foldr
:
copyList :: [t] -> [t]
copyList xs = foldr (:) [] xs
Używanie skomentował typ powyżej, foldr (:) []
oznacza to: „jeśli widzisz pustą listą zwróci pustą listę, a jeśli widzisz parę return head:tailResult
. "
Korzystanie Churchlist
, można łatwo napisać odpowiednik w ten sposób:
-- Note that the definitions of nil and cons mirror the two foldr equations!
nil :: Churchlist t u
nil = \k z -> z
cons :: t -> Churchlist t u -> Churchlist t u
cons x xs = \k z -> k x (xs k z)
copyChurchlist :: ChurchList t u -> Churchlist t u
copyChurchlist xs = xs cons nil
Teraz, aby wdrożyć map
, wystarczy zastąpić cons
z odpowiedniej funkcji, takich jak to:
map :: (a -> b) -> [a] -> [b]
map f xs = foldr (\x xs' -> f x:xs') [] xs
Mapowanie jest jak kopiowanie listy, z tą różnicą, że zamiast tylko kopiować elementy w dosłownym brzmieniu, dla każdej z nich stosuje się f
.
Przestudiuj dokładnie to i powinieneś być w stanie samodzielnie napisać mapChurchlist :: (t -> t') -> Churchlist t u -> Churchlist t' u
.
Dodatkowe ćwiczenia (łatwe): napisz list tych funkcji pod względem foldr
i napisać odpowiedniki dla Churchlist
:
filter :: (a -> Bool) -> [a] -> [a]
append :: [a] -> [a] -> [a]
-- Return first element of list that satisfies predicate, or Nothing
find :: (a -> Bool) -> [a] -> Maybe a
Jeśli czujesz jak przeciwdziałanie coś mocniej, spróbować napisać tail
dla Churchlist
. (Start pisząc tail
dla [a]
użyciu foldr
.)
Sieć [kodowanie Kościół] (https://secure.wikimedia.org/wikipedia/en/wiki/Church_encoding#List_encodings) Strona Wikipedia wydaje się dobrym miejscem do rozpoczęcia od. –
@jcdmb: Czy uczysz się informatyki w KIT? –