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