Key differences between Church and Haskell

Haskell's type system is far more powerful than the type system implemented in the Church compiler. Church's type system does not currently support higher kinded types and does not currently support monads.

A variant of Haskell's type-class mechanism is supported in which type-classes (c.f. interfaces in Java) are permitted to contain just one method. Because there is only one method in each type-class, it is possible to identify a type-class by the name of the method it contains. This in turn allows the compiler to deduce which type-classes would be required by an implementation, from which point the compiler is able to effectively manufacture the type-class declarations that would normally form a visible part of a Haskell program. Because Church follows Haskell's design that functions are entitled to declare multiple type-classes, little seems to be lost in restricting each type-class to contain a single method. 

Church uses eager evaluation, where Haskell uses lazy evaluation by default. Church does this for two reasons. Firstly, Church works by translating Church source code into Java source to be compiled to run on a standard Java VM. As Java's evaluation is eager, the source-to-source translation is made more direct by adopting the conventions of the host platform. Secondly, at a minimum, lazy values have storage requirements that have to provide space for one extra value: the not-evaluated state. So a lazy Boolean has three states: truefalse and not-evaluated  which requires two bits of storage. For numerical primitives types, like int and double, there is a significant performance penalty incurred by representing their lazy numerical values: fundamentally because the 2^32 + 1 or 2^64 +1 states don't fit into the appropriate machine word. Use of the heap for numerical computations typically causes at least an order of magnitude in performance loss and far greater losses are possible when thunks cause memory leaks. GHC is able to mitigate, and in many cases completely eradicate, these problems with a combination of strictness analysis, the strictness annotation, !, and the, $!, compiler directive.