Иногда часть кода, которую я хочу написать, недопустима без хотя бы одного языкового расширения. Это особенно верно при попытке реализовать идеи в исследовательских работах, которые, как правило, используют любую изящную, супер-расширенную версию GHC, доступную на момент написания статьи, без указания того, какие расширения на самом деле требуются.
В результате я часто получаю что-то подобное в верхней части моих файлов.hs:
{-# LANGUAGE TypeFamilies
, MultiParamTypeClasses
, FunctionalDependencies
, FlexibleContexts
, FlexibleInstances
, UndecidableInstances
, OverlappingInstances #-}
Я не возражаю против этого, но часто мне кажется, что я приношу слепые жертвы, чтобы умилостивить Великого Бога GHC. Он жалуется, что определенный фрагмент кода недействителен без языкового расширения X, поэтому я добавляю прагму для X. Затем он требует, чтобы я включил Y, поэтому я добавляю прагму для Y. К тому времени, когда это закончится, я включить три или четыре языковых расширения, которые я на самом деле не понимаю, и я понятия не имею, какие из них «безопасны».
Чтобы объяснить, что я имею в виду под «безопасным»:
Я понимаю, что UndecidableInstances
безопасен, потому что, хотя это может привести к тому, что компилятор не завершит работу, пока код компилируется, он не будет иметь неожиданных побочных эффектов.
С другой стороны, OverlappingInstances
явно небезопасен, потому что мне очень легко случайно написать код, выдающий ошибки во время выполнения.
Итак, мой вопрос:
Is there a list of GHCextensions which are considered 'safe' and which are 'unsafe'?