Aquí está mi comprensión de cómo funciona esto.
Esta es la explicación más simple que pude pensar, intenté (a propósito) evitar cualquier concepto o palabra potencialmente confuso.
Un concepto importante a tener en cuenta es la aplicación parcial.
La forma en que entiendo esto es que en Haskell podemos "arreglar" uno de los parámetros de la función a un valor conocido, por lo que ahora la función acepta un parámetro menos.
Recapitulación: el tipo de const es:
const :: a -> b -> a
Como un ejemplo más simple, vamos a “fijar” el primer parámetro a ser (+)
let f = const (+)
Ahora que nos hemos fijado la primer parámetro de const, "f" es una función que acepta solo un único parámetro. Pero como const siempre devuelve su primer parámetro, que hemos corregido, significa que lo que pasamos a "f" se ignorará, y siempre devolverá la función "+".
Como un ejemplo, toda la siguiente dará 5, ya que f siempre devolverá la función de “+”, independientemente de lo que recibió como primer parámetro, y la función de “+” operará en 2 y 3:
f “aaa” 2 3
f 904212 2 3
f undefined 2 3
El tipo de f es:
f :: b -> Integer -> Integer -> Integer
Nota que “b” puede ser cualquier cosa, como puede verse más arriba.
Ahora para la función real en cuestión:
g = const id
Esto significa que “fijos” id como primer parámetro, de manera que el anterior, “g” ignora su primer parámetro y devuelve la función de “id” . En Haskell, podemos seguir adelante y proporcionar el parámetro adicional para “Identificación”, tal como lo hicimos con (+) anterior, así que por ejemplo todos ellos regresarán 42:
g “aaa” 42
g undefined 42
Así “g” está aceptando función de dos parámetros, y siempre regresaba al segundo, por lo que su tipo es:
g = const id :: b -> a -> a
Pero espera un minuto, acabo de hacer un gran salto allí. ¿No debería el tipo ser:
b -> (a -> a)
dado que acabamos de decir que aceptamos cualquier cosa y devolvemos "id"?
Bueno, sí, excepto que en Haskell esos paréntesis pueden omitirse.
También tiene sentido ya que puede suministrar inmediatamente la función "id" con el parámetro adicional que necesita (como en el ejemplo "const (+)" anterior).
Solo para completar las respuestas provistas, recuerde que todas las funciones en Haskell están al curry, entonces 'a -> (b -> c)' es lo mismo que 'a -> b -> c' –
Hay una [pregunta similar ] (http://stackoverflow.com/questions/18680341/what-is-the-purpose-of-const-id-in-this-function), pero tiene una respuesta más situacional, que podría ser más clara, dependiendo de tu proceso de pensamiento – chwarr