I have defined the following function:

```
let rec g2 f h n x =
match n with
|0 -> x
| n -> g2 h f (n-1) (f x);;
```

Running it, I get the type

g2: ('a->'a) → ('a->'a) → int → 'a → 'a

All of these types make sense to me except for h:

I can see how h can essentially be any type whatsoever, because it isn’t used in g2, which has me wondering why specifically it is a function?

Also, why does it map from ('a → 'a) if it can be any function? Wouldn’t a more general type be mapping from one domain to another? I.g ('b → 'c) rather than from the same to the same?

Of course this question assumes, that F#'s type inference evaluates to the most general type, if this isn’t the case, am I right in assuming ('b → 'c) is more general than ('a → 'a)?