Despacho dinámico, constructores inteligentes, plantilla haskell tal vez?
-
22-10-2019 - |
Pregunta
Estoy mirando Haskellwiki> Tipo existencial # Mecanismo de envío dinámico.
Y estoy pensando, debería haber una manera en la plantilla Haskell para tomar esta parte:
class Shape_ a where
...
type Radius = Double
data Circle = Circle Radius
instance Shape_ Circle where
...
y deriva automáticamente esta 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)
¿Se ha hecho esto en la plantilla Haskell? ¿Se puede hacer esto en th? ¿Se puede hacer algo similar en el viejo Haskell sin tener que escribir todos los constructores inteligentes a mano? ¿Se requeriría esto un preprocesador especial que sea más poderoso que TH?
Solución
Definitivamente se puede hacer con la plantilla Haskell. Hay muy poco que no pueda. Pero encuentro que escribir el código de la plantilla Haskell es bastante doloroso.
Con GHC 7.4 y el Restricción Extensión, también puede abstraer parte de ella:
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
Automatizar esas declaraciones de instancias es otra cosa que, que solo yo sepa, solo puede hacer.
Otros consejos
¿Qué hay de agregar un método al Shape_
clase con una implementación predeterminada:
toShape :: a -> Shape
toShape = Shape
Para el arte anterior, ver el Exception
clase y SomeException
tipo de datos.