haskell instance typeclass type-signature

¿Por qué no se pueden poner firmas de tipo en declaraciones de instancia en Haskell?



instance typeclass (5)

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 con el hecho de permitir firmas duplicadas en principio, pero no hay ninguna ventaja en permitirlas en general, y es más sencillo no permitirlas. Por lo tanto, la definición de idioma dice que puede haber, como máximo, una firma de tipo por entidad. La característica de permitir firmas también en declaraciones de instancia no se ha pedido mucho, por lo que no hay una extensión que lo permita. Si realmente desea eso, puede elevar una solicitud de función en el trac GHC . Si obtiene suficiente interés, puede implementarse (pero no espero que la demanda sea alta).

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 instancia no parecen estar permitidas, y si coloco una, recibo un error de "firma de tipo fuera de lugar" de GHC. ¿Por qué esto es tan? ¿Por qué GHC no puede verificar si la firma de tipo es la misma que esperaba y rechazar (o advertir) si no lo es?


En cualquier caso, el tipo es redundante y uno normalmente quiere evitar redundancias. En Frege , sin embargo, está permitido escribir firmas de tipo para miembros de instancia. Son revisados ​​y luego desechados. Por supuesto, es más fácil prohibirlos de inmediato.


La mayoría de las otras respuestas aquí son bastante antiguas ... ahora hay una extensión de idioma:

pega lo siguiente en la parte superior de tu archivo:

{-# Language InstanceSigs #-}


Puede agregar firmas de tipo para instancias usando [el nuevo] -XInstanceSigs , que es especialmente útil para traer variables de tipo en el alcance. Puedes encontrar más información en los documentos oficiales .


Puede crear las funciones por separado, fuera del cuerpo de la instancia, si realmente desea 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 = ...