Bueno, podemos comentar el tipo Churchlist esta forma de aclararlo:
-- 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
Tenga en cuenta que este está íntimamente relacionada con la función foldr
:
foldr :: (t -> u -> u) -> u -> [t] -> u
foldr k z [] = z
foldr k z (x:xs) = k x (foldr k z xs)
foldr
es una función muy general que puede implementar todo tipo de otras funciones de lista. Un ejemplo trivial que le ayudará a está implementando una copia lista con foldr
:
copyList :: [t] -> [t]
copyList xs = foldr (:) [] xs
El uso del tipo comentado anteriormente, foldr (:) []
que esto significa: "si ves una lista vacía devuelve la lista vacía, y si ves un par devuelva head:tailResult
. "
Usando Churchlist
, puede escribir fácilmente la contrapartida de esta manera:
-- 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
Ahora, para implementar map
, sólo tiene que sustituir cons
con una función adecuada, así:
map :: (a -> b) -> [a] -> [b]
map f xs = foldr (\x xs' -> f x:xs') [] xs
El mapeo es como copiar una lista, excepto que en lugar de simplemente copiar los elementos al pie de la letra, aplica f
a cada uno de ellos.
Estudie todo esto cuidadosamente, y debería poder escribir mapChurchlist :: (t -> t') -> Churchlist t u -> Churchlist t' u
usted mismo.
ejercicio extra (fácil): escribir estas funciones de lista en términos de foldr
, y escribir homólogos de 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
Si te sientes como hacer frente a algo más difícil, trate de escribir tail
para Churchlist
. (Empieza por escribir tail
de [a]
usando foldr
.)
la página [codificación Iglesia] (https://secure.wikimedia.org/wikipedia/en/wiki/Church_encoding#List_encodings) en la wikipedia parece ser un buen lugar para empezar de. –
@jcdmb: ¿Estudias ciencias de la computación en KIT? –