Is my lambda calculus reduction correct and final form valid in simply typed lambda calc?
While your way of calculating the types isn't quite how it works, it gives the right answer here. As you say, you end up with f 0 having type R and g 0 having type R. Since we apply f 0 to g 0, R must be of the form R -&gt; X for some X. In other words, you have the equi-recursive type R = R -&gt; X. Such types are almost always disallowed. Thus, this would be a type error. If R is a fixed primitive type, e.g. a type of primitive natural numbers, then it is simply not the case that R = R -&gt; X and so you would also get a type error.