expédition dynamique, les constructeurs intelligents, modèle Haskell peut-être?
-
22-10-2019 - |
Question
Je regarde HaskellWiki> Type # Existentielle mécanisme de répartition dynamique .
Et je pense, il devrait y avoir un moyen dans le modèle Haskell de prendre cette partie:
class Shape_ a where
...
type Radius = Double
data Circle = Circle Radius
instance Shape_ Circle where
...
et d'en tirer automatiquement cette partie:
-- 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)
a-t-il été fait dans le modèle Haskell? Cela peut-il être fait dans TH? Peut-être quelque chose de similaire fait dans la plaine vieux Haskell sans avoir à écrire tous les constructeurs intelligents à la main? Serait-ce besoin d'un pré-processeur spécial qui est plus puissant que TH?
La solution
Il peut certainement être fait avec modèle Haskell. Il y a très peu qui ne peut pas. Mais je trouve l'écriture du code modèle Haskell pour être assez pénible.
Avec GHC 7.4 et ConstraintKinds extension, vous pouvez aussi partie abstraite de celui-ci:
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
Automatiser ces déclarations est un autre exemple TH chose, et au mieux de ma connaissance que TH, peut faire.
Autres conseils
Qu'en est-il ajouter une méthode à la classe Shape_
avec une implémentation par défaut:
toShape :: a -> Shape
toShape = Shape
Pour l'art antérieur, voir la classe Exception
et SomeException
type de données.