
I'm sure anyone who's used Haskell for any significant length of time has received this error message: Occurs check: cannot construct the infinite type: t = t -> t1 I for one took that as a challenge, and have implemented a type inference engine for infinite types. Expr> s (a -> b -> c) -> (a -> b) -> a -> c Expr> skk a -> a Expr> s(skk)(skk) (fix a . (a -> b)) Expr> Points of interest: * There are NO error conditions. it-unifier can assign a type to every syntactically valid expression of combinatory logic. * Typechecking is guaranteed to terminate in a linear number of steps, an (apparently) stronger guarantee than that provided by DHM. * (Mostly theoretical, since it-unify does not yet support sums or products): Fixpoint types subsume declared recursive datatypes. e.g: type List a = fix l . Either () (a,l) darcs get http://members.cox.net/stefanor/fixtypes/