Haskell and Scheme are almost polar opposites, this makes it pretty useless to say which one is "better"
- Dynamic typing
- Duck typing
- Strong static typing (though with type inference)
- Parametric polymorphism
- Many different and partially compatible implementations
- Primary differences are in things like modules, IO, and various predefined functions.
- Minimalistic standard.
- Small to Medium standard library + SFRIs
- Many many possible targets. It is possible to run Scheme on almost all platforms.
- 1-2 major implementations which are almost completely compatible.
- Primarily differing in complex types (RankN or Existentials) or in syntactic sugar (indention rules)
- 2-3 minor implementations which are highly compatible.
- Complete and fully featured standard.
- Large standard library + Hackage (Sort of a Haskell CPAN)
- Uniform syntax
- Infix notation encouraged
- Template-Haskell (A way of doing meta-programming in haskell)
- Consistent syntax
- Very terse
- Pragmatically functional
- Code as data - consciceData as code
- Avoid complexity
- Syntactical and procedural abstraction
- Purely (and still pragmatically) functional
- Types and Static checking
- Functional and Data abstraction
- Encourage multiple layers of abstraction
- Some implementations are quite active.
- Fragmented, Chicken users are writing very differently then Chez users.
- Stereotypically a "Lisp hacker"
- Very very active
- Reputation (not fully deserved) for being academic and mathy.
- Stereotypically a mad professor-esque academic.
What to Take Away
Scheme and Haskell compliment each other nicely. Haskell is arguably better for bigger applications but not so great for embedding. Scheme is wonderful for embedding but may not be as well suited for large applications.
Learning either one is a major mind-bender and each provides a different view on how to do functional programming.