Почему я должен указывать класс типов в функции, если он был объявлен в определении данных?

Если у меня есть ADT с указанными ограничениями класса типов, мне все равно придется указать один и тот же класс типов для каждой функции, использующей этот тип данных. В чем причина этого и как я могу уменьшить количество ненужного набора текста?

Пример:

data Eq a => C a = V a
g :: C a -> Bool
g (V a) = a == a

Я получил:

test.hs:32:13:
    No instance for (Eq a)
      arising from a use of `=='
    In the expression: a == a
    In an equation for `g': g (V a) = a == a
Failed, modules loaded: none.

В то время как:

g :: Eq a => C a -> Bool

Работает нормально, но если у меня длинная цепочка функций, становится бременем указывать класс типов каждый раз:

f :: Eq a => C a -> Bool
f a = g a
7
задан Andrew 12 August 2011 в 17:06
поделиться