Domanda

sto guardando HaskellWiki> esistenziale tipo # dinamico meccanismo di invio .

E sto pensando, ci dovrebbe essere un modo in Template Haskell di prendere questa parte:

class Shape_ a where
    ...

type Radius = Double
data Circle = Circle Radius

instance Shape_ Circle where
    ...

e derivare automaticamente questa parte:

-- 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)

È stato fatto questo in Template Haskell? questo può essere fatto in TH? Può qualcosa di simile essere fatto in pianura vecchio Haskell, senza dover scrivere fuori tutti i costruttori intelligenti a mano? Sarebbe questo richiede uno speciale pre-processore che è più potente del TH?

È stato utile?

Soluzione

Si può sicuramente essere fatto con Template Haskell. C'è molto poco che non può. Ma trovo la scrittura di codice Template Haskell per essere piuttosto doloroso.

Con GHC 7.4 e l'estensione ConstraintKinds , è anche parte astratta di esso:

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

L'automazione tali dichiarazioni di istanza è un'altra cosa TH, e al meglio della mia conoscenza solo TH, può fare.

Altri suggerimenti

Che dire di aggiungere un metodo alla classe Shape_ con un'implementazione di default:

toShape :: a -> Shape
toShape = Shape

Per tecnica, vedere la classe Exception e SomeException tipo di dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top