Creo este espacio con la intención de que sea colaborativo y abierto para todo aquel que sepa programar en Haskell, un lenguaje que se basa bastante en las matemáticas que todos conocemos, con sus particularidades.
En realidad Haskell es teoría de categorías camuflada como lenguaje de programación.

Veamos, lo que tienes aquí es una función \[ g \] que toma dos parámetros \[ a,b \] y te devuelve una función que está definida como composición de otras cuatro. Quizás se vea más claro si se introducen paréntesis y se escribe así:
g a b = b.head.(map (\(_,c) -> menor a c)).(filter (even.fst))Como \( \text{g a b} \) es una función, para encontrar su tipo debes aplicarla a un elemento (digamos \[ d \], de tipo \[ t(d) \]) y encontrar el tipo de \[ \text{(g a b) d} \]. Si este último tipo es \[ u \], tendrás que \[ \text{g a b} \] tiene tipo \[ t(d) \to u \] y por tanto \[ g \] tendrá tipo \[ t(a) \to t(b) \to t(d) \to u \].
Por tanto, vamos a intentar inferir el tipo de:
(g a b) d = b ( head ( (map (\(_,c) -> menor a c) (filter (even.fst) d))))Ahora lo más natural es ir de dentro hacia fuera. La primera observación es que \[ d \] debe tener tipo \[ t(d)=[(x,y)] \] donde \[ x,y \] son otros tipos. Esto es por un lado por el tipo de filter, que es de tipo \[ (a \to Bool) \to [a] \to [a] \] y porque \[ even.fst \] es de tipo \[ (x,y) \to Bool \] (ya que \[ fst \] es de tipo \[ (x,y) \to x \] y \[ even \] de tipo \[ x \to Bool \]). Además, puedes deducir que \[ x \] debe ser un tipo de números enteros (para que la aplicación de \[ even \] tenga sentido).
Por otro lado, conociendo el tipo de filter se ve que el tipo de filter (even.fst) d es de nuevo \[ [(x,y)] \].
También está bien a la vez que miras el tipo ir entendiendo qué hace la función, lo cual te será de ayuda para localizar errores. En este primer paso, tenemos que \[ d \] es una lista de tuplas (donde los elementos de la primera componente son enteros) y
filter (even.fst) dnos devuelve otra lista con las tuplas cuya primera componente es par.
Si quieres puedes ir siguiendo tú. Si tienes algún problema dilo y pongo una solución completa. Una observación por eso es que el tipo depende de la función \[ menor \], que no es una función estándar de Haskell y debe estar definida aparte. Imagino que la intención es que sea algo como \[ menor :: Int \to Int \to Bool \], donde aplicado a dos enteros devuelve True si el primero es menor que el segundo y False en caso contrario.
Agregado.