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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top