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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top