Dynamischer Versand, intelligente Konstruktoren, Vorlage Haskell vielleicht?
-
22-10-2019 - |
Frage
Ich schaue auf Haskellwiki> existenzieller Typ # Dynamischer Versandmechanismus.
Und ich denke, es sollte einen Weg in der Vorlage Haskell geben, diesen Teil zu nehmen:
class Shape_ a where
...
type Radius = Double
data Circle = Circle Radius
instance Shape_ Circle where
...
und leiten Sie diesen Teil automatisch ab:
-- derive the data type
data Shape = forall a. Shape_ a => Shape a
-- derive smart constructors similar to the original constructor
circle :: Radius -> Shape
circle r = Shape (Circle r)
Wurde dies in Template Haskell getan? Kann das in th gemacht werden? Kann etwas Ähnliches in einfachem alten Haskell getan werden, ohne alle intelligenten Konstruktoren von Hand schreiben zu müssen? Würde dies einen speziellen Pre-Processor erfordern, der mächtiger ist als TH?
Lösung
Es kann auf jeden Fall mit Vorlage Haskell geschehen. Es gibt sehr wenig, was nicht kann. Aber ich finde, dass das Schreiben von Vorlage Haskell -Code ziemlich schmerzhaft ist.
Mit GHC 7.4 und der Einschränkungen Erweiterung können Sie auch einen Teil davon abstrahieren:
data Some :: (* -> Constraint) -> * where
Some :: forall cls a. cls a => a -> Some cls
type Shape = Some Shape_
instance Shape_ Shape where
perimeter (Some a) = perimeter a
area (Some a) = area a
shape :: Shape_ a => a -> Shape
shape = Some
Die Automatisierung dieser Instanzdeklarationen ist eine andere Sache, und nach bestem Wissen kann es nur tun.
Andere Tipps
Was ist mit dem Hinzufügen einer Methode zum Hinzufügen zu der Shape_
Klasse mit einer Standardimplementierung:
toShape :: a -> Shape
toShape = Shape
Für frühere Kunst siehe die Exception
Klasse und SomeException
Datentyp.