When starting a new Haskell project which needs language features that are offered by both new and older extensions, which should I use? The new one or the old one? For example:
- GADTs supersede ExistentialQuantification.
- TypeFamilies in many cases supersede FunctionalDependencies.
- etc. (if you have more examples feel free to add here)
I incline towards the newer ones as they feel cleaner and they add more features to the language in a unified manner. However, the older ones are supported by more compilers, they're used in existing libraries and perhaps also better known among programmers.
Update: As mentioned in answers/comments, the "supersede" relationships above are not completely precise. However, I'm interested in (often occurring) cases when a task can be accomplished equally well by several extensions.