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?
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
@shachaf: assolutamente. Buon punto Personalmente preferisco anche precisare ogni estensione in ogni file sorgente che li utilizza. – shang
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