Estoy tratando de hacer esta pregunta desde mi tarea:
Dado arbitrario
foo :: [[a]] -> ([a], [a]), escriba una ley quefoosatisfaga la función , involucrandomapen 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 concaty concat'cuáles son las funciones de tipo [[a]] -> [a]. Entonces foosatisfacebimap (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 foocorrectamente?
(\(a,b) -> (map f a, map f b)) . foo = foo . map (map f)