Предположим, у меня есть тип данных, например
data D a = D a a a
и класс типов
class C c ...
instance (C c1, C c2) => C (c1, c2)
. Затем я хочу иметь возможность написать
data D a = D a a a deriving C
и сгенерировать экземпляр
instance C ((a, a), a) => C (D a)
с использованием изоморфизма по модулю ленивого вычисления,
D a ~ ((a, a), a)
Note. Использование нового типа и GeneralizedNewtypeDeriving
не будет работать, если, например, имеются данные D m = D (m Integer) (m Integer)
.
Примечание 2. Этот вопрос имеет отношение к выразительности Haskell в целом - такие языки, как Python, имеют нечто, называемое именованными кортежами, которые можно использовать везде, где используются кортежи; этот вопрос показывает, где/как я не знаю, как эмулировать то же самое в Haskell.