Implement type inference for a language with:

variables, lambda functions, application

let binding

integers, boolean, binary integer & boolean operators

recursive values declaration

Implement Let polymorphism, using the algorithm defined on pages 333-334.

Implement a few basic operations on data types, including multiplication, addition, equality

Use the State monad to collect your constraints

Implement the unification algorithm

Define Show instances for your data types to output the results using a pleasant notation

Here are grammar files and abstract syntax to get you started: