Por que a informação do tipo na caixa vermelha não é: 'a -> 'a -> 'a -> 'a -> 'a
?
Acho que todos os parâmetros e o valor de retorno devem ser do mesmo tipo, e o utop confirma que todos eles são do mesmo Z.t
tipo.
utop # let rec fib_acc = fun n -> fun n_1 -> fun n_2 -> fun acc ->
if (Z.equal n Z.one) || (Z.equal n (Z.of_int 2))
then acc
else fib_acc (Z.add n Z.minus_one) n_2 (Z.add n_1 n_2) (Z.add n_1 n_2);;
val fib_acc : Z.t -> Z.t -> Z.t -> Z.t -> Z.t = <fun>