Pivoteando algunas preguntas recientes, pensé que pondría el centro de atención en el viejo coco, OverlappingInstances
.¿Qué hay de malo en OverlappingInstances?
Hace algunos años podría haber hecho esta pregunta en serio: después de todo, puede proporcionar instancias predeterminadas útiles y otras pueden anularlas con otras más específicas cuando lo necesiten, ¿qué puede ser tan malo al respecto?
A lo largo del camino he absorbido algunas apreciaciones para el punto de vista de que OverlappingInstances
realmente no es tan limpio, y es mejor evitarlo; principalmente debido al hecho de que no está bien fundamentada teóricamente, a diferencia de otras grandes extensiones.
Pero pensándolo bien, no estoy seguro de poder explicarle a otra persona lo que realmente es tan malo, si me pidieran.
Lo que estoy buscando son ejemplos específicos de maneras en que el uso de OverlappingInstances
puede llevar a que sucedan cosas malas, ya sea subvirtiendo el sistema de tipos u otras invariantes, o simplemente inesperado general o desorden.
Un problema particular que conozco es que rompe la propiedad de que simplemente agregar o quitar una importación de un solo módulo no puede cambiar el significado de su programa, porque con la extensión activada, una nueva superposición de instancia podría agregarse silenciosamente o remoto. Aunque puedo ver por qué es desagradable, no veo por qué es terriblemente espantoso.
Pregunta extra: Siempre y cuando nos refiramos a extensiones útiles pero no teóricamente bien fundamentadas que pueden conducir a malos sucesos, ¿cómo es que GeneralizedNewtypeDeriving
no tiene la misma mala reputación? ¿Es porque las posibilidades negativas son más fáciles de localizar? que es más fácil ver lo que podría causar problemas y decir, "no hagas eso"?
:
EDITAR (Nota yo preferiría si la peor parte de la respuesta se centra en OverlappingInstances
, no IncoherentInstances
que necesita menos explicaciones.): También hay buenas respuestas a una pregunta similar here.
Lo malo de 'GeneralizedNewtypeDeriving' es un error de implementación. No hay nada malo acerca de esta extensión como tal, pero ghc lo permite en casos donde debería ser prohibido. – augustss
Relacionados: http://stackoverflow.com/questions/10830757/is-there-a-list-of-ghc-extensions-that-are-considered-safe –
@augustss, ¿es así de simple? Ver http://hackage.haskell.org/trac/ghc/ticket/5498. Simon dice que no sabe de una prueba sintáctica simple para determinar cuándo debería prohibirse y que requiere nuevos trabajos teóricos y avances en el verificador de tipos para que sea seguro. – glaebhoerl