2010-03-13 13 views
9

Al trabajar con instancias derivadas en Haskell, ¿es posible derivar funciones para tipos arbitrarios, o estamos restringidos a funciones particulares?Derivar funciones arbitrarias en Haskell

+0

Hehe, +1 si encontraste esto porque esperabas poder derivar 'Test.QuickCheck.Arbitrary' para ADTs. :) –

Respuesta

9

Puede derivar instancias de las siguientes clases en haskell 98: Eq, Ord, Enum, Ix, Bounded, Read y Show.

Usando extensiones ghc también puede derivar instancias de las siguientes clases: Tipo, Datos, Functor, Plegable y Traversable. También hay una extensión ghc que permite a un nuevo tipo derivar instancias de su tipo de implementación.

No se pueden derivar instancias de clases arbitrarias por la simple razón de que haskell no sabría cómo generar las funciones necesarias sin un conocimiento especial sobre la clase en cuestión.

+0

Pero GHC puede manejar algunos casos simples. Si dices 'newtype Bar = Bar Foo' y Foo tiene una instancia de Quux, entonces GeneralizedNewtypeDeriving puede derivar la instancia de Quux para Bar para ti. Por supuesto, esto es solo un desenvolvimiento trivial, pero es mejor que nada. – jrockway

6

Usted está restringido a clases particulares, en términos de lo que el compilador sabe cómo derivar para usted. Usando un preprocesador, o Template Haskell, usted mismo puede codificar nuevos mecanismos de derivación, si conoce los enfoques generales para producir implementaciones de funciones para tipos particulares.

6

Las otras dos respuestas son correctas. Pero si necesita más, hay algunos paquetes en Hackage que pueden manejar más. Me gusta Data.Derive mucho, ya que puede generar el código fuente directamente (para compatibilidad) o engancharlo en Template Haskell para hacerlo en tiempo de compilación. Ya se admite una amplia gama de clases, y es muy fácil agregar soporte para las suyas. Resumen: terreno de la publicidad para una maldita buena biblioteca :-)

+0

Ahora tomo esto de vuelta. En ese momento, no había intentado agregar mi propio apoyo, pero supuse que era fácil. No lo es; se trata de recompilar la biblioteca a partir de lo que puedo decir. Pero aún así, el soporte integrado es bueno y completo. – luqui

4

Para añadir a la respuesta de Don: derivar funcionalidad personalizada para los tipos de datos se llama generic programming y hay una lot of literature sobre esto. Los preprocesadores y Template Haskell no son las únicas soluciones; vea uno de los documentos de resumen que lista de literatura para otras opciones.

Cuestiones relacionadas