Предположим, у меня есть тип данных, например
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)
Примечание. Использование нового типа и GeneralizedNewtypeDeriving
не сработает, если, например, есть data D m = D (m Integer) (m Integer)
.
Примечание 2. Этот вопрос имеет отношение к выразительности Haskell в целом - такие языки, как Python, имеют нечто, называемое именованными кортежами, которые можно использовать везде, где используются кортежи; этот вопрос показывает, где/как я не знаю, как эмулировать то же самое в Haskell.