Without FlexibleContexts
all typeclass constraints on function definitions must have type variables. For example:
add :: Num a => a -> a -> a
add = (+)
Where a
is the type variable. With FlexibleContexts
enabled you can have any type inside a typeclass.
intAdd :: Num Int => Int -> Int -> Int
intAdd = (+)
This example is pretty contrived but it is the simplest I can think of. FlexibleContexts
is usually only used with MultiParamTypeClasses
. Here is an example:
class Shower a b where
myShow :: a -> b
doSomething :: Shower a String => a -> String
doSomething = myShow
Here you can see we say that we only want a Shower a String
. Without FlexibleContexts
String
would have to be a type variable instead of a concrete type.