2012-01-26 13 views
6

C'è una "caratteristica" fastidiosa che le istanze derivate sono anche influenzate dall'estensione RebindableSyntax. Esempio di ciò che voglio scrivere:Haskell - un modo per disattivare la sintassi rebindable per il caso di istanze `derivanti`?

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

Questo esce con l'errore "Non nel campo di applicazione:` ifThenElse'".

+1

Non sai cosa stai cercando di fare, ma sarebbe utile per spostare la definizione in un altro file senza 'RebindableSyntax'? –

risposta

7

Sembra una disfunzione per me - la clausola deriving è piena di magia incorporata comunque, quindi sono scettico sul fatto che le istanze derivate che usano la sintassi di rimbalzo sarebbero utili nella pratica. Ora, se si potesse anche riassociare la clausola deriving e usare invece una giunzione TH ... ma sto divagando.

Sospetto che la soluzione più semplice e semplice sia l'utilizzo di moduli diversi. Inserire la definizione del tipo di dati nel proprio modulo, utilizzare la clausola deriving con le funzioni Prelude in ambito, quindi importare il tipo nel modulo usando la sintassi rebindable. Se hai bisogno di ulteriore modularità nei tuoi moduli, nota anche che StandaloneDeriving esiste e ti consente di definire i tipi in un modulo (con RebindableSyntax attivo), derivare le istanze in un altro modulo (senza RebindableSyntax) e importarli entrambi dai moduli che effettivamente usano Il tipo.

+0

sì, la derivazione autonoma dovrebbe avvenire prima delle definizioni che richiedono l'istanza, no? Ad esempio, non è possibile scrivere 'data Color = ...' e alcuni 'foo :: Colore -> Colore -> Bool',' foo c1 c2 = c1 == c2' se non è ancora stata importata l'istanza 'Eq'. – gatoatigrado

Problemi correlati