CS 386L Programming Assignment (HW 6) 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 Use the following type definitions type X = String data Type = TInt | TBool | Fun Type Type | TVar X | TPoly [X] Type data Term = Var X | Lam X Term | App Term Term | Let X Term Term | Rec X Term | Num Int | Binary X Term Term