При работе с полученными экземплярами в Haskell действительно ли возможно получить функции для произвольных типов, или мы ограничиваемся конкретными функциями?
В haskell 98 можно получить экземпляры следующих классов: Eq, Ord, Enum, Ix, Bounded, Read и Show.
Используя расширения ghc, вы также можете создавать экземпляры следующих классов: Typeable, Data, Functor, Foldable и Traversable. Также существует расширение ghc, которое позволяет новому типу извлекать экземпляры из своего типа реализации.
Вы не можете получить экземпляры произвольных классов по той простой причине, что haskell не знал бы, как сгенерировать необходимые функции без специальных знаний о рассматриваемом классе.
Вы ограничены определенными классами с точки зрения того, что компилятор знает, как получить за вас. Используя препроцессор или Template Haskell, вы можете сами создавать новые механизмы вывода, если знаете общие подходы к созданию реализаций функций для определенных типов.
Два других ответа верны. Но если вам нужно больше, есть несколько пакетов на взломе, которые могут справиться с большим. Мне очень нравится Data.Derive , поскольку вы можете сгенерировать исходный код напрямую (для совместимости) или подключить его к Template Haskell, чтобы сделать это во время компиляции. Уже поддерживается широкий спектр классов, и очень легко добавить поддержку для своих собственных. Резюме: рекламный ход чертовски хорошей библиотеки: -)
Чтобы добавить к ответу Дона: производная пользовательская функциональность для типов данных называется generic programming , и об этом много литературы. Препроцессоры и Шаблон Haskell не являются единственными решениями; см. один из обзорных документов, в которых приведен список литературы для других вариантов.