Me acabo de dar cuenta de lo útil que puede ser la pequeña función on
.¿Cómo hacer que Haskell calcule el tipo polimórfico correcto?
Ex:
orderByLength = sortBy (compare `on` length)
Pero, por desgracia, los tipos inferidos puede ser algo contrario a la intuición.
De acuerdo con la definición misma
f `on` g = \x y -> f (g x) (g y)
uno podría, por ejemplo, reemplazar
(==) `on` length
con
\x y -> (length x) == (length y)
Pero ambos tienen diferentes tipos!
El primero tiene [a] -> [a] -> Bool
mientras que el segundo tiene el tipo correcto, más genérico de [a] -> [b] -> Bool
.
Esto no permite términos obviamente correctos como (on (==) length) [1, 2, 3] ["a", "b", "c"]
(que debería dar como resultado True
pero ahora incluso falla la comprobación de tipos).
Sé que esta restricción surge debido al uso de first-rank types, pero ¿cómo superar esto? ¿Alguien puede formular una implementación de on
que pueda manejar correctamente las funciones polimórficas (utilizando los tipos de cuantificación/rango universales n)?
cosa fresca - ¿Qué es la 'C'? Un tipo '* -> *'? Ah, es para envolver el uso potencial de '[tipo]' ... ¿Se puede generalizar para cualquier * tipo *? – Dario
Genial, gracias por ambas ideas – Dario