時折、私が書きたいと思っているコードが、少なくとも 1 つの言語拡張がなければ合法ではないことがあります。これは、研究論文でアイデアを実装しようとするときに特に当てはまります。研究論文では、どの拡張機能が実際に必要であるかを明確にせずに、論文が書かれた時点で利用可能だった、気の利いた超拡張バージョンの GHC を使用する傾向があります。
その結果、.hs ファイルの先頭に次のようなものが表示されることがよくあります。
{-# LANGUAGE TypeFamilies
, MultiParamTypeClasses
, FunctionalDependencies
, FlexibleContexts
, FlexibleInstances
, UndecidableInstances
, OverlappingInstances #-}
私はそれを気にしませんが、GHC の偉大な神をなだめるために盲目的な犠牲を払っているように感じることがよくあります。特定のコードは言語拡張 X なしでは無効であると不平を言うので、X のプラグマを追加します。次に、Y を有効にするように要求するので、Y のプラグマを追加します。これが完了するまでに、私は私がよく理解していない 3 つまたは 4 つの言語拡張機能を有効にすると、どれが「安全」なのかわかりません。
「安全」の意味を説明するには:
UndecidableInstances
コンパイラが終了しない可能性がありますが、コードがコンパイルされる限り、予期しない副作用が発生しないため、安全であることは理解しています。一方、
OverlappingInstances
は明らかに安全ではありません。実行時エラーを発生させるコードを誤って記述しやすくなるためです。
だから私の質問は:
「安全」と見なされ、「安全でない」GHCextensions のリストはありますか?