2012-05-03 10 views
11

He leído acerca de algunos de los problemas con los registros Haskell, en particular, el hecho de que dos elementos en el mismo módulo no pueden tener el mismo nombre.Haskell records, un enfoque más limpio?

entiendo puede solucionar esto por tener módulos separados, pero yo no quería hacer eso y en cambio trataron este enfoque:

class HasX a where 
    x :: a -> X 

data D1 = D1 { d1_x :: X, ... } 
instance HasX D1 where 
    x = d1_x 

data D2 = D2 { d2_x :: X, ... } 
instance HasX D2 where 
    x = d2_x 

(Esto sólo se consigue, no juegos, que había por supuesto, necesita escribir más código para hacer conjuntos).

Sin embargo, parece que las declaraciones de clase y de instancia para todo esto parecen un tipo de repetitivo que debería poder eliminarse, utilizando plantillas de haskell u otra cosa.

¿Hay alguna biblioteca o extensión en GHC que haga que este enfoque sea menos complicado de escribir?

+0

Sí, oops. Fijo. – Clinton

+1

Es un poco más complicado que eso ya que los dos campos pueden no tener el mismo tipo. – augustss

+0

Para mis propósitos, suponga que los campos con el mismo nombre tienen el mismo tipo. No tendré campos con el mismo nombre que tengan diferentes tipos. – Clinton

Respuesta

5

Parece Data.Has encapsula mucho de lo que estás buscando. En su vocabulario, creo que su clase de tipo Knows está más cerca de su Has, y también proporciona una firma para inyección.

También utilizan un mecanismo de etiquetado para tratar un problema que no creo que haya considerado todavía: registros que contienen campos que tienen el mismo tipo. Usan etiquetas de nivel de tipo para hacer esta desambiguación.

Para mayor comodidad, también parece ser algún tipo de apoyo que proporciona un generador para la Has ejemplo, con plantilla de Haskell en Has-TH

Puede encontrar más etiquetas de nivel de tipo y otro material de registro relevante en las obras de la Oleg el mago tipo, como OOHaskell (también con Ralf Lämmel).

+0

¿Podría indicarme alguna documentación de estilo tutorial para 'Data.Has' (y' Has-TH' para el caso). Se parece más o menos a lo que estoy buscando, pero no estoy seguro de cómo armarlo todo. – Clinton

+0

En realidad, encontré esto para 'Data.Has': https://github.com/nonowarn/has/blob/master/examples/Announce04.lhs – Clinton

0

la plantilla de datos-acceso puede al menos ayudar a escribir los accesadores set/get. Tal vez algunas personas puedan crear el código Template Haskell para la generación de clases e instancias para cada nombre de campo de registro. Sin embargo, yo no uso el material de Template Haskell yo mismo. Lo restringe a GHC, e incluso a versiones específicas de GHC, ya que Template Haskell cambia entre las diferentes versiones de GHC. Tener un registro (principal) por módulo realmente vale la pena.

Cuestiones relacionadas