Haskell, instância Gen de B quando a classe A fornece informações suficientes para a classe B

Enquanto escrevia uma classe para um tipo de coleção / contêiner (btw aponte-me para os tipos existentes se estiver reinventando a roda) para fornecer uma interface geral para adicionar e remover elementos de qualquer tipo de 'coleção'.

class (Eq (c a), Monoid (c a)) => Collection c a where
  emptyColl   :: c a -> Bool
  splitColl   :: c a -> (a, c a)
  toColl      :: a -> c a
  size        :: c a -> Int
  combineColl :: a -> c a -> c a
  (>|<)       :: a -> c a -> c a
  a >|< c     =  combineColl a c

Percebi que instâncias da coleção também podem ser instâncias do dobrável. Usando splitColl e emptyColl. Portanto, você também não precisa escrever um Dobrável, se você criar construções como essa em várias classes uma quantidade significativa de tempo, escrevendo instâncias triviais, poderá ser salvo.

Tentei fazer da coleção uma instância do dobrável. No entanto, as classes não parecem instanciadas de outras, não é? Recebi as seguintes mensagens de erro:

instance Functor (Collection c) where

The first argument of ‘Functor’ should have kind ‘* -> *’,
  but ‘Collection c’ has kind ‘* -> GHC.Prim.Constraint’
In the instance declaration for ‘Functor (Collection c)’ 

instance Functor (Collection c a) where

 The first argument of ‘Functor’ should have kind ‘* -> *’,
  but ‘Collection c a’ has kind ‘GHC.Prim.Constraint’
In the instance declaration for ‘Functor (Collection c a)’

Como eu poderia obter a funcionalidade desejada? Eu acho que o modelo Haskell pode ser o caminho a percorrer aqui, eu nunca o usei, um exemplo seria ótimo :)

Desde já, obrigado!

PS: Escrevo haskell há cerca de um ano, pequenas dicas que me vêm à mente são muito apreciadas

questionAnswers(1)

yourAnswerToTheQuestion