Me gusta poner firmas de tipo para todas las definiciones de nivel superior en mi código. Sin embargo, las firmas de tipo en las declaraciones de instancias no parecen permitidas, y si pongo una, recibo un error de "firma de tipo erróneo" de GHC. ¿Por qué esto es tan? ¿Por qué GHC no puede verificar si la firma tipo es la misma que esperaba y rechazar (o advertir) si no es así?¿Por qué no se pueden poner firmas de tipo en declaraciones de instancias en Haskell?
Respuesta
Puede crear las funciones por separado, fuera del cuerpo de la instancia, si realmente quiere las declaraciones de tipo.
class Class a where
f1 :: a -> a
instance Class Foo where
f1 = foo_f1
--monomorphic version of f1 for Foo:
foo_f1 :: Foo -> Foo
foo_f1 = ...
Dado que la firma es parte de la definición de clase, una firma de tipo en una declaración de instancia sería una firma duplicada. No creo que haya un problema para permitir la duplicación de firmas en principio, pero no hay ninguna ventaja en general, y es más simple no permitirlas. Entonces la definición del lenguaje dice que puede haber como máximo un tipo de firma por entidad. La característica de permitir firmas también en declaraciones de instancias no se ha solicitado demasiado, por lo que no hay una extensión que lo permita. Si realmente lo desea, puede presentar una solicitud de función en el GHC trac. Si obtiene suficiente interés, puede implementarse (pero no espero que la demanda sea alta).
La ventaja será que GHC verificará la firma: el programador puede afirmar su creencia sobre la firma del tipo y hacer que se revise y atrapar en caso de que sea incorrecta. – Prateek
@Prateek El compilador lo comprueba contra la firma en la clase de todos modos. Como cualquier firma excepto la de la definición de clase (con las variables de tipo pertinentes sustituidas por los tipos de instancia) debe rechazarse, no puede proporcionar información adicional o seguridad. Solo sería un poco de documentación adicional para los lectores del código (eso no es malo, pero puede lograrlo ahora con firmas en los comentarios; lo hago si creo que los tipos no son obvios y conocidos).) –
Quise decir contra lo que el programador cree que es la firma (además de verificar contra la firma en la clase). Esto no proporciona seguridad adicional, es cierto. Pero puede proporcionar mensajes de error más comprensibles: "crees que la firma de tipo es X, pero en realidad es Y" en lugar de otro tipo de error. Además, permite que un programador adopte un estilo uniforme de declaraciones de tipo de escritura, en lugar de tener que hacer un caso especial de comentarios dentro de las declaraciones de instancia. – Prateek
En cualquier caso, el tipo es redundante y uno normalmente quiere evitar redundancias. En Frege, no obstante, se permite escribir firmas de tipo para los miembros de la instancia. Ellos son revisados y luego desechados. Por supuesto, es más fácil prohibirlos de inmediato.
La redundancia a veces es buena. – ThePiercingPrince
Puede agregar firmas de tipo para las instancias usando [la nueva] -XInstanceSigs, que es especialmente útil para poner las variables de tipo en el alcance. Puede encontrar más información en el official docs.
- 1. Haskell: leído y tipo firmas
- 2. ¿Por qué Haskell no llega a inferir las clases de tipos de datos en las firmas de funciones?
- 3. Haskell superpuestas instancias y funciones de tipo
- 4. ¿Por qué no se pueden inferir estos argumentos de tipo?
- 5. sobrecarga de funciones Firmas Haskell
- 6. instancias huérfanas en Haskell
- 7. Poner en la cadena de tipo de nombre en Haskell
- 8. ¿Por qué no se pueden anotar todas las declaraciones en Java?
- 9. ¿Qué tokens se pueden parametrizar en declaraciones preparadas con PDO?
- 10. ¿Por qué son paréntesis significativos en F # declaraciones de tipo
- 11. ¿Por qué los valores polimórficos no se infieren en Haskell?
- 12. Haskell: ¿Por qué este tipo de verificación?
- 13. ¿Cómo se anulan las instancias de clase de tipo Haskell proporcionadas por el código del paquete?
- 14. No se pueden mostrar 2 instancias de mi SurfaceView personalizado
- 15. ¿Por qué no se pueden sobrecargar las funciones por tipo de devolución?
- 16. Plantilla Haskell declaraciones
- 17. ¿Por qué no pueden los parámetros de tipo de plantilla no ser del tipo de clase
- 18. Variable de tipo de instancia en Haskell
- 19. No se pueden crear varias instancias de PowerPoint
- 20. ¿Por qué no se puede usar this.type para nuevas instancias?
- 21. ¿Por qué no se pueden salpicar Ellipsis y NotImplemented?
- 22. Haskell "no" tipo restricción
- 23. ¿Por qué los nombres de usuario no se pueden cambiar?
- 24. ¿Qué tipo de alcance usa Haskell?
- 25. Haskell: ¿Por qué no hay desajuste de tipo (y por qué compila esto)?
- 26. ¿Por qué es tan raro usar firmas de tipo en cláusulas where?
- 27. Agregar restricciones de tipo al contexto de las declaraciones de instancia en Haskell
- 28. ¿Por qué esta afirmación de Haskell no se evalúa perezosamente?
- 29. Functor/Instancias aplicables para estado en Haskell
- 30. Flechas/HXT y firmas de tipo
En [el ticket que abrí] (http://hackage.haskell.org/trac/ghc/ticket/5676) SPJ comentó: "He deseado [firmas de tipo en declaraciones de instancias] yo mismo, así que lo hice en un momento libre ". Actualmente estableció el hito en GHC 7.6, aunque hay pocas posibilidades de que llegue a GHC 7.4. Gracias por hacer esta pregunta! Y gracias, Daniel Fischer, por sugerir que hagamos un boleto. –