Handhabung mehrerer Typen mit derselben internen Darstellung und minimalem Boilerplate?

Beim Schreiben größerer Programme in Haskell stoße ich häufig auf ein Problem. Ich möchte oft mehrere unterschiedliche Typen, die eine interne Darstellung und mehrere Kernoperationen gemeinsam haben.

s gibt zwei relativ offensichtliche Ansätze, um dieses Problem zu löse

One verwendet eine Typklasse und dasGeneralizedNewtypeDeriving extension. Ordnen Sie einer Typklasse genügend Logik zu, um die vom Anwendungsfall gewünschten gemeinsamen Operationen zu unterstützen. Erstellen Sie einen Typ mit der gewünschten Darstellung und erstellen Sie eine Instanz der Typklasse für diesen Typ. Erstellen Sie dann für jeden Anwendungsfall Wrapper mit newtype und leiten Sie die gemeinsame Klasse ab.

Der andere besteht darin, den Typ mit einer Phantomtypvariablen zu deklarieren und dann @ zu verwendeEmptyDataDecls, um unterschiedliche Typen für jeden Anwendungsfall zu erstellen.

Mein Hauptanliegen ist es nicht, Werte zu verwechseln, die interne Repräsentationen und Operationen gemeinsam haben, aber in meinem Code unterschiedliche Bedeutungen haben. Beide Ansätze lösen dieses Problem, fühlen sich jedoch erheblich ungeschickt. Mein zweites Anliegen ist es, die benötigte Menge an Boilerplate zu reduzieren, und beide Ansätze sind dabei gut genu

Was sind die Vor- und Nachteile der einzelnen Ansätze? Gibt es eine Technik, die dem, was ich will, näher kommt und Typensicherheit ohne Boilerplate-Code bietet?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage