Haskell’s combination of purity, higher-order functions, parameterized algebraic data
types, and type classes makes implementing polymorphism much easier than in other
languages. We don’t need to think about types belonging to a big hierarchy. Instead, we
consider what the types can act like and then connect them with the appropriate type
Int can act like a lot of things—an
equatable thing, an ordered thing, an enumerable thing, and so on.
Type classes are open, which means that we can define our own data type, think about what it can act like, and connect it with the type classes that define its behaviors. We can also introduce a new type class and then make already existing types instances of it. Because ...