title: When to use Multiparameter type classes in Haskell?
body: <p>I would like to understand the differences between the following two definitions of a Collection type class.</p>
  
  <p>With multiparameter typeclasses and functional dependencies (taken from <a href="http://en.wikibooks.org/wiki/Haskell/Advanced_type_classes" rel="nofollow">here</a>);</p>
  
  <pre><code>{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, FunctionalDependencies #-}
  
  class Eq e =&gt; Collection c e | c -&gt; e where
      insert :: c -&gt; e -&gt; c
      member :: c -&gt; e -&gt; Bool
  
  instance Eq a =&gt; Collection [a] a where
      insert = flip (:)
      member = flip elem
  </code></pre>
  
  <p>With only a single type parameter;</p>
  
  <pre><code>class Collection c where
      insert :: Eq e =&gt; c e -&gt; e -&gt; c e
      member :: Eq e =&gt; c e -&gt; e -&gt; Bool
  
  instance Collection [] where
      insert = flip (:)
      member = flip elem
  </code></pre>
  
  <p>Both seem to compile and work ok. Are there any practical differences between the two, or any reason to favour one approach over the other?</p>