2012-01-26 8 views
6

Hay una molesta "función" que las instancias derivadas también se ven afectadas por la extensión RebindableSyntax. Ejemplo de lo que quiero escribir:Haskell: ¿alguna forma de desactivar la sintaxis reenganchable para el caso de instancias `derivadas`?

{-# LANGUAGE RebindableSyntax #-} 
import qualified Prelude 
data Color = Red | Green | Blue | Periwinkle | Fuschia deriving (Prelude.Eq, Prelude.Ord) 

Esto viene a colación con el error "No en su alcance:` ifThenElse'".

+1

No estoy seguro de lo que está tratando de hacer, pero ¿sería útil mover la definición a otro archivo sin 'RebindableSyntax'? –

Respuesta

7

Eso me parece una mala característica - la cláusula deriving está llena de magia incorporada de todos modos, así que soy escéptico de que las instancias derivadas que usan la sintaxis de rebote sean útiles en la práctica. Ahora, si también puede volver a enlazar la deriving cláusula en sí y usar un empalme TH en su lugar ... pero estoy divagando.

Sospecho que la solución más simple y fácil es usar diferentes módulos. Coloque la definición de tipo de datos en su propio módulo, utilice la cláusula deriving allí con las funciones Prelude en el alcance, luego importe el tipo en el módulo utilizando la sintaxis reenganchable. Si necesita más modularidad en sus módulos, tenga en cuenta que también existe StandaloneDeriving, y le permite definir los tipos en un módulo (con RebindableSyntax activo), derivar las instancias en otro módulo (sin RebindableSyntax) e importar ambos desde módulos que realmente usan el tipo.

+0

Sí, la derivación independiente tendría que ocurrir antes de cualquier definición que requiera la instancia, ¿no? es decir, no podría escribir 'datos Color = ...' y algunos 'foo :: Color -> Color -> Bool',' foo c1 c2 = c1 == c2' si todavía no hay una instancia 'Eq' importada. – gatoatigrado

Cuestiones relacionadas