Czy istnieje lista rozszerzeń GHC, które są uważane za „bezpieczne”?

Czasami fragment kodu, który chcę napisać, nie jest legalny bez co najmniej jednego rozszerzenia języka. Jest to szczególnie prawdziwe, gdy próbuje się wdrożyć pomysły w pracach badawczych, które zwykle używają dowolnej, supernowoczesnej wersji GHC, która była dostępna w czasie pisania artykułu, bez wyjaśnienia, które rozszerzenia są rzeczywiście wymagane.

W rezultacie często kończę na czymś takim na górze moich plików .hs:

{-# LANGUAGE TypeFamilies
           , MultiParamTypeClasses
           , FunctionalDependencies
           , FlexibleContexts
           , FlexibleInstances
           , UndecidableInstances
           , OverlappingInstances #-}

Nie przeszkadza mi to, ale często czuję się tak, jakbym robił ślepe ofiary, by uspokoić Wielkiego Boga GHC. Narzeka, że ​​pewna część kodu nie jest poprawna bez rozszerzenia języka X, więc dodaję pragmę dla X. Potem wymaga, żebym uaktywnił Y, więc dodam pragmę dla Y. włącz trzy lub cztery rozszerzenia językowe, których tak naprawdę nie rozumiem, i nie mam pojęcia, które z nich są „bezpieczne”.

Aby wyjaśnić, co rozumiem przez „bezpieczny”:

Rozumiem, żeUndecidableInstances jest bezpieczny, ponieważ chociaż może spowodować, że kompilator nie zakończy działania, dopóki kod się skompiluje, nie będzie miał niespodziewanych skutków ubocznych.

Z drugiej strony,OverlappingInstances jest wyraźnie niebezpieczny, ponieważ bardzo ułatwia mi przypadkowe zapisanie kodu, który powoduje błędy w czasie wykonywania.

Więc moje pytanie brzmi:

Czy istnieje lista rozszerzeń GHC, które są uważane za „bezpieczne” i które są „niebezpieczne”?

questionAnswers(1)

yourAnswerToTheQuestion