2013-03-01 25 views
7

Próbuję zrozumieć transformatory Monada poprzez wdrożenie mojej malutkiej biblioteki opartej na projektach już istniejących.Jakie rozszerzenia języków wymaga biblioteka MTL?

Utknąłem w sprawie rozszerzeń językowych. W MonadError jedynym wspomnianym rozszerzeniem jest UndecidableInstances. Jednak nie mogę uzyskać podobnego kodu do kompilacji bez używania również FunctionalDependencies i FlexibleInstances.

Przykład że wierzę wymaga FunDeps:

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

oraz elastyczne instancję:

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

Jak działa kod MonadError uniknąć dodatkowych dwa rozszerzenia?

Odpowiedz

11

Nie musisz przeliterować wszystkich rozszerzeń w samym pliku źródłowym. Typowe rozszerzenia używane przez wszystkie/większość modułów mogą być wymienione w pliku cabal projektu. W mtl's case:

extensions: 
    MultiParamTypeClasses 
    FunctionalDependencies 
    FlexibleInstances 
+7

Uwaga: Można to zrobić, ale wiele osób woli przeliterować rozszerzenia za pomocą 'pragma LANGUAGE' w każdym pliku. W ten sposób pliki mogą być autonomiczne i ghci-stanie, i łatwo jest zobaczyć, jakie rozszerzenia każdego konkretnego pliku używa, ponieważ nie trzeba włączać każdego rozszerzenia dla każdego pliku. Zależy to od tego, z których rozszerzeń korzystasz i jak bardzo się rozchodzi. – shachaf

+1

@shachaf: Absolutnie. Słuszna uwaga. Ja też osobiście wolę przeliterować każde rozszerzenie w każdym pliku źródłowym, który z nich korzysta. – shang

+2

Oba są przydatne. Myślę, że zalecanym podejściem powinno być pisanie rozszerzeń w zależności od potrzeb na plik przy użyciu "JĘZYK" i zapisywanie potrzebnych rozszerzeń dla pakietu w polu 'other-extensions' Cabala. Lista 'other-extensions' nie jest włączona domyślnie, ale nadal może służyć do zrozumienia, jakie wymagania rozszerzenia ma pakiet (bez konieczności przeglądania wszystkich plików źródłowych indywidualnie). – kosmikus