Какие языковые расширения требуется для библиотеки MTL?
Я пытаюсь понять монадные преобразователи, внедряя свою собственную крошечную библиотеку на основе конструкций существующих.
То, на чем я застрял - это языковые расширения. В MonadError единственным упомянутым расширением является UndecidableInstances
, Тем не менее, я не могу получить подобный код для компиляции без использования FunctionalDependencies
а также FlexibleInstances
,
Пример, который я считаю, требует FunDeps:
class (Monad m) => MonadError e m | m -> e where
И гибкий пример:
instance MonadError e m => MonadError e (MaybeT m) where
Как работает MonadError
код избежать двух дополнительных расширений?
1 ответ
Решение
Вам не нужно прописывать все расширения в самом исходном файле. Общие расширения, которые используются всеми / большинством модулей, могут быть перечислены в файле cabal проекта. В случае MTL:
extensions:
MultiParamTypeClasses
FunctionalDependencies
FlexibleInstances