WHAT’S IN A TYPECLASS?

Monads are an advanced abstraction mechanism, and the abstraction in Haskell is based on the idea of typeclasses (typeclasses, not type classes). Typeclasses are an abstraction that C# and many other object oriented languages don’t have. Look at the following examples to understand what they do.

Say you have your own data type — a discriminated union in Haskell, very similar to an enum in .NET:

data Food = Pasta | Pizza | Chips

You also have a function that can check whether two given values of type Food are considered equal:

isEqualFood :: Food -> Food -> Bool

isEqualFood Pasta Pasta = True

isEqualFood Pizza Pizza = True

isEqualFood Chips Chips = True

isEqualFood _ _ = False

The variations of the function declare the three special cases explicitly in which the two given parameters are the same — in these cases the result is True. In all other cases, denoted by the use of the wildcard operator _, the result is False.

Using the function on a Haskell console at this stage would render these results:

Main> isEqualFood Pizza Chips

False

Main> isEqualFood Pizza Pizza

True

Main>

Of course, a check for equality of two values is something you want to be able to do with most data types. In other words, there is a group, a class of types, for which comparing for equality makes sense. In Haskell, a typeclass can be used to describe that class of types. Here’s how a typeclass for the purpose of equality comparison could be written:

class MyEq a where

  isEqual ...

Get Functional Programming in C#: Classic Programming Techniques for Modern Projects now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.