Ale, creo haber entendido que la idea de tu función ordenar es que si la función es <, ordenar usando <, y si la función fuera >, ordenar usando >. ¿Entendí bien?
> y < son funciones que ya están definidas en Haskell, y que sólo comparan cosas que Haskell sabe comparar (creo que con :t > podés ver el prototipo de la función para ver bien qué cosas puede comparar esa función, supongo que los Ord o algo así).
Pero, por ejemplo, si vas a implementar una función ordenar que recibe por parámetro el criterio de comparación, estaría bueno también que, por ejemplo, puedas ordenar una lista de, no se, Personas. O Autos. O Golondrinas. Y cada una con un criterio que vos quieras.
No se trata tanto de pensar en qué criterios uno podría querer usar para ordenar una lista, si no pensar qué significa
ordenar una lista.
Si tuvieras un duende al que le pasás dos
cosas y él te sabe contestar cuál de las dos cosas tiene que aparecer antes para estar ordenado, ¿no podrías hacer una función que
delege a ese duende todo lo necesario y se encargue estrictamente de ordenar la lista siguiendo el criterio del duende?
Ese es el punto acá: ya hay una función, que te pasan por parámetro (y que en tu caso se llama f) que sabe decirte cuál de dos cosas que le pases va antes. Esa función
podría ser <, o podría ser >. Pero también podría ser una función así (hace *años* no escribo Haskell, espero que sea bastante válido mi código):
menorEnergia :: Golondrina -> Golondrina -> Bool
menorEnergia anterior siguiente = (energia anterior) < (energia siguiente) -- aca seguro sobran parentesis, pero bleh
Y entonces, si esa función estuviera definida (y estuvieran definidas las Golondrinas, y la función energia), podría querer hacer una invocación así:
ordenar menorEnergia [(pepita, 50), (pepona, 20), (juanSalvador, 73)]
Y debería obtener la lista ordenada como corresponde.
Y otro podría implementar que existan Satelites, y una función que los compare según la altitud de su órbita, y otra función que compare según el peso del satélite, y lo que quiera.. Y tu función debería seguir sirviendo. Porque mientras te pasen una función que sepa comparar los elementos de la lista que te pasan, tu función ordenar debería funcionar.
Ordenar una lista es siempre igual: lo que cambia según el tipo de cosa que haya
adentro de la lista es la forma de
comparar a los elementos de esa lista. Por eso lo extraemos a una función aparte, y delegamos en ella esos detalles.
¿Recordás cómo aplicar una función que te pasaron por parámetro? Quizá te puedan servir un poco las páginas de
Aplicación y
Orden superior de la wiki de Uqbar.
¡Un abrazo!