A functional programming language intepreter with typeclasses, full type inference and lazy evaluation