Если у меня есть 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