turboPower a b = turboPower' 1 a b
where
turboPower' x a 0 = x
turboPower' x a b
| x `seq` a `seq` b `seq` False = undefined
| even b = turboPower' x (a*a) (b `div` 2)
| otherwise = turboPower' (x*a) a (b-1)
Básicamente, lo que se quiere hacer es mover la multiplicación de que está haciendo en el "otherwise
" el paso (ya que eso es lo que hace que esto sea recursiva de cola inicialmente) a otro parámetro.
Editado para agregar una línea que hace que los tres parámetros sean estrictamente evaluados, en lugar de perezosos, ya que esta es una de esas situaciones conocidas en las que la pereza puede perjudicarnos.
No necesita '>' delante del código. Solo sangría por cuatro espacios. –
Por cierto, probablemente deberías usar 'quot' en lugar de' div'. Además, tenga en cuenta que el '(^)' habitual también se basa en un algoritmo de exponenciación rápida. – dfeuer