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
Respuesta
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.
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
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.
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 :-)
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
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.
- 1. Función de aplicar funciones arbitrarias en I
- 2. funciones externas en haskell?
- 3. datos de tuberías a través de funciones arbitrarias en Clojure
- 4. Igualdad de funciones en Haskell
- 5. ¿Guardias Haskell en funciones lambda?
- 6. Serialización de funciones en Haskell
- 7. sobrecarga de funciones Firmas Haskell
- 8. Haskell: funciones duplicadas (+) y (++), mappend
- 9. Secciones arbitrarias en roxygen docs
- 10. Numeración de dimensiones arbitrarias
- 11. plataforma Haskell: funciones anidadas y optimización
- 12. Haskell superpuestas instancias y funciones de tipo
- 13. Cómo llama funciones dinámicamente con Haskell
- 14. Funciones de Haskell de izquierda a derecha
- 15. Haskell newtype, pero conserva las funciones anteriores
- 16. Par Haskell y funciones de desvinculación
- 17. ¿Cómo funciona la derivación en Haskell?
- 18. Bibliotecas de Precisión Arbitrarias JVM
- 19. ¿Está bien derivar de System.ArgumentException?
- 20. Cómo se implementan las funciones de la biblioteca en Haskell
- 21. Aplicar varias funciones al mismo valor sin puntos en Haskell
- 22. Haskell scoping en definiciones de funciones anidadas utilizando
- 23. funciones simples de Haskell en estilo sin puntos
- 24. Examinando las partes internas de las funciones en Haskell
- 25. Tablas de verdad de funciones anónimas en Haskell
- 26. composición de funciones en Haskell con argumentos de tupla
- 27. ¿Cómo puedo ejecutar mis funciones Haskell a través de Java
- 28. Calcular unión de dos formas arbitrarias
- 29. Jackson ObjectMapper con claves JSON arbitrarias
- 30. ¿Por qué GHC no puede derivar instancias para Monoid?
Hehe, +1 si encontraste esto porque esperabas poder derivar 'Test.QuickCheck.Arbitrary' para ADTs. :) –