При определении класса типов, как вы решаете между включением/исключением функции в определении typeclass? Например, каковы различия между этими двумя случаями:
class Graph g where
...
insertNode :: g -> Node -> g
insertNode graph node = ...
vs
class Graph g where
...
insertNode :: (Graph g) => g -> Node -> g
insertNode graph node = ...