haskell — какой-либо способ генерировать «производные» экземпляры для грубо кортежно-изоморфных типов данных?

Предположим, у меня есть тип данных, например

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.

7
задан gatoatigrado 11 March 2012 в 23:21
поделиться