Haskell and Scheme are almost polar opposites, this makes it pretty useless to say which one is "better"
Typing
Scheme
- Dynamic typing
- Duck typing
Haskell
- Strong static typing (though with type inference)
- Parametric polymorphism
Tooling/Standardization
Scheme
- 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.
Haskell
- 1-2 major implementations which are almost completely compatible.
- Primarily differing in complex types (RankN or Existentials) or in syntactic sugar (indention rules)
- Complete and fully featured standard.
- Large standard library + Hackage (Sort of a Haskell CPAN)
- The main compilers tend to be large but there are compilers to C and JavaScript.
Syntax
Scheme
- S-exprs
- Macros
- Uniform syntax
- semi-concise
Haskell
- Infix notation encouraged
- Template-Haskell (A way of doing meta-programming in haskell)
- Consistent syntax
- Very terse
Concepts
Scheme
- Pragmatically functional
- Code as data - Data as code
- Avoid complexity
- Syntactical and procedural abstraction
Haskell
- Purely (and still pragmatically) functional
- Types and Static checking
- Functional and Data abstraction
- Encourage multiple layers of abstraction
Community
Scheme
- Some implementations are quite active.
- Fragmented, Chicken users are writing very differently than Chez users.
- Friendly
- Stereotypically a "Lisp hacker"
Haskell
- Very very active
- Friendly
- Reputation (not fully deserved) for being academic and mathy.
- Stereotypically a mad professor-esque academic.
What to Take Away
Scheme and Haskell complement 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.