Иногда кусок кода, который я хочу написать, не является законным без хотя бы одного расширения языка. Это особенно актуально, когда вы пытаетесь внедрить идеи в исследовательские документы, которые, как правило, используют ту, которая была доступна в момент, когда была написана статья, сверхбыстрая версия GHC, не указав, какие расширения действительно необходимы.
В результате я часто получаю что-то вроде этого в верхней части моих файлов .hs:
{-# LANGUAGE TypeFamilies
           , MultiParamTypeClasses
           , FunctionalDependencies
           , FlexibleContexts
           , FlexibleInstances
           , UndecidableInstances
           , OverlappingInstances #-}
Я не против этого, но часто чувствую, что я делаю слепые жертвы, чтобы успокоить Великого Бога GHC. Он жалуется, что определенный фрагмент кода недействителен без расширения языка X, поэтому я добавляю прагму для X. Затем он требует включения Y, поэтому я добавляю прагму для Y. К тому времени, когда это закончится, я включите три или четыре расширения языка, которые я действительно не понимаю, и я понятия не имею, какие из них "безопасны".
Чтобы объяснить, что я подразумеваю под "безопасным":
-  Я понимаю, что UndecidableInstancesбезопасен, потому что хотя это может привести к тому, что компилятор не завершится, пока компиляция кода не будет иметь неожиданных побочных эффектов.
-  С другой стороны, OverlappingInstancesявно небезопасен, потому что мне очень легко случайно записать код, который дает ошибки времени выполнения.
Итак, мой вопрос:
Есть ли список GHCextensions, которые считаются "безопасными" и которые являются "небезопасными"?
