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?
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
@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
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