2011-12-03 22 views
13

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?

+3

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. –

Respuesta

10

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 = ... 
4

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).

+1

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

+1

@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).) –

+4

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

3

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.

+2

La redundancia a veces es buena. – ThePiercingPrince

11

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.

Cuestiones relacionadas