Should I use typeclasses or not?

Why I shouldn’t do something simple and only defining functions
without defining new data types and typeclasses (with their
instances).

Why indeed? You could just define:

checkState :: (a -> Bool) -> (a -> b) -> (a -> b) -> a -> b
checkState is_repairable repairs destroy a
    = if (is_repairable a) then repairs a else destroy a

People misuse type classes all the time. It doesn’t mean that it’s idiomatic.

To answer your more general question, here are some rules of thumb for when to use type classes and when not to use them:

Use type classes if:

  • There is only one correct behavior per given type

  • The type class has associated equations (i.e. “laws”) that all instances must satisfy

Don’t use type classes if:

  • You are trying to just namespace things. That’s what modules and namespaces are for.

  • A person using your type class cannot reason about how it will behave without looking at the source code of the instances

  • You find that the extensions you have to turn on are getting out of control

Leave a Comment