2013-03-01 10 views
7

Sto cercando di capire i trasformatori monad implementando la mia piccola libreria basata sui progetti di quelli esistenti.Quali estensioni di lingua richiede la libreria MTL?

Quello su cui sono bloccato sono le estensioni della lingua. In MonadError, l'unica estensione menzionata è UndecidableInstances. Tuttavia, non riesco a ottenere codice simile da compilare senza utilizzare anche FunctionalDependencies e FlexibleInstances.

Esempio che credo richiede FunDeps:

class (Monad m) => MonadError e m | m -> e where 

e un'istanza flessibile:

instance MonadError e m => MonadError e (MaybeT m) where 

Come funziona il codice MonadError evitare l'extra due estensioni?

risposta

11

Non è necessario specificare tutte le estensioni nel file sorgente stesso. Le estensioni comuni utilizzate da tutti/la maggior parte dei moduli possono essere elencate nel file cabal del progetto. In mtl's case:

extensions: 
    MultiParamTypeClasses 
    FunctionalDependencies 
    FlexibleInstances 
+7

Nota: È possibile farlo, ma molte persone preferiscono precisare estensioni con 'pragma Language' in ogni file. In questo modo i file possono essere standalone e ghci-able, ed è facile vedere quali estensioni utilizzano ciascun particolare file, dal momento che non è necessario attivare ogni estensione per ogni singolo file. Dipende da quali estensioni stai usando e in modo pervasivo. – shachaf

+1

@shachaf: assolutamente. Buon punto Personalmente preferisco anche precisare ogni estensione in ogni file sorgente che li utilizza. – shang

+2

Entrambi sono utili. Penso che l'approccio raccomandato dovrebbe essere quello di precisare le estensioni necessarie per file usando un pragma 'LANGUAGE', e di registrare le estensioni necessarie per un pacchetto nel campo' other-extensions' di Cabal. L'elenco "other-extensions" non è abilitato di default, ma può ancora servire a capire quali sono i requisiti di estensione di un pacchetto (senza dover guardare tutti i file sorgente singolarmente). – kosmikus

Problemi correlati