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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top