¿Manejando múltiples tipos con la misma representación interna y un mínimo estándar?

Me encuentro con un problema comúnmente, cuando escribo programas más grandes en Haskell. A menudo me encuentro con ganas de múltiples tipos distintos que comparten una representación interna y varias operaciones centrales.

Hay dos enfoques relativamente obvios para resolver este problema.

Uno está usando una clase de tipo y elGeneralizedNewtypeDeriving extensión. Ponga suficiente lógica en una clase de tipo para soportar las operaciones compartidas que el caso de uso desee. Cree un tipo con la representación deseada y cree una instancia de la clase de tipo para ese tipo. Luego, para cada caso de uso, cree envoltorios para él con newtype y derive la clase común.

La otra es declarar el tipo con una variable de tipo fantasma y luego usarEmptyDataDecls para crear tipos distintos para cada caso de uso diferente.

Mi principal preocupación no es mezclar valores que compartan representación interna y operaciones, sino que tengan diferentes significados en mi código. Ambos enfoques resuelven ese problema, pero se sienten significativamente torpes. Mi segunda preocupación es reducir la cantidad de repetitivo requerida, y ambos enfoques funcionan lo suficientemente bien.

¿Cuáles son las ventajas y desventajas de cada enfoque? ¿Existe una técnica que se acerque a hacer lo que quiero, proporcionar seguridad de tipo sin código repetitivo?

Respuestas a la pregunta(3)

Su respuesta a la pregunta