Tento di spiegarti meglio che posso, con una funzione un po' piu` semplice...
Prendi le funzioni
codice:
f x = floor (x / 2)
g x = mod x 2
che sono rispettivamente di tipo
codice:
f :: (RealFrac a, Integral b) => a -> b
g :: (Integral a) => a -> a
Ora se le metti insieme (togliendo di mezzo la ricorsione, perche' non ho idea di come faccia il compilatore a inferire il tipo di una funziona ricorsiva)
Ottieni che h e` di tipo
codice:
(RealFrac a, Integral a, Integral b) => a -> (a, b)
Ovvero il compilatore si aspetta come parametro un valore di un tipo che sia allo stesso tempo un'istanza di RealFrac (Float o Double) e di Integral (Int o Integer), siccome non esiste un tipo del genere ti da l'errore.