Estoy tratando de hacer esta pregunta desde mi tarea:
Dado arbitrario
foo :: [[a]] -> ([a], [a])
, escriba una ley quefoo
satisfaga la función , involucrandomap
en listas y pares.
Algún contexto: soy un estudiante de primer año que toma un curso de programación funcional. Si bien el curso es bastante introductorio, el profesor ha mencionado muchas cosas fuera del programa de estudios, entre los cuales se encuentran los teoremas gratuitos. Entonces, después de intentar leer el documento de Wadler, calculé que concat :: [[a]] -> [a]
la ley map f . concat = concat . map (map f)
parece relevante para mi problema, ya que debemos tener foo xss = (concat xss, concat' xss)
dónde concat
y concat'
cuáles son las funciones de tipo [[a]] -> [a]
. Entonces foo
satisfacebimap (map f, map g) . foo = \xss -> ((fst . foo . map (map f)) xss, (snd . foo . map (map g)) xss)
.
Esta "ley" ya parece demasiado larga para ser correcta, y tampoco estoy seguro de mi lógica. Entonces pensé en usar un generador de teoremas gratis en línea , pero no entiendo qué lift{(,)}
significa:
forall t1,t2 in TYPES, g :: t1 -> t2.
forall x :: [[t1]].
(f x, f (map (map g) x)) in lift{(,)}(map g,map g)
lift{(,)}(map g,map g)
= {((x1, x2), (y1, y2)) | (map g x1 = y1) && (map g x2 = y2)}
¿Cómo debo entender esta salida? ¿Y cómo debo derivar la ley para la función foo
correctamente?
(\(a,b) -> (map f a, map f b)) . foo = foo . map (map f)