Dinamiche di spedizione, intelligenti costruttori, Template Haskell forse?
-
22-10-2019 - |
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?
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.