多くの場合、多くの場所で使用されているコア関数を何らかの方法で構成可能にする必要があります。つまり、コマンドラインスイッチに応じてアルゴリズムAまたはアルゴリズムBのいずれかを使用できます。または、「debug」フラグが何らかの方法で設定されている場合は、余分な情報をstdoutに出力します。
このようなグローバルフラグをどのように実装する必要がありますか?
4つのオプションがありますが、どれもあまり良くありません。
関数からコマンドライン引数を読み取ります-悪いです。これにはIOモナドが必要であり、コア計算関数はすべて純粋であるため、そこにIOを入れたくありません。
main / IOから、動作を変更する必要のある「leaf」関数にパラメーターを渡します。これは、このパラメーターを渡すために、異なるモジュール内の多数の無関係な関数を変更することを意味するため、完全に使用できません。そのようなものを試してみたいと思います。毎回ラッピングコードを変更せずに、構成オプションを複数回。
unsafePerformIO
真のグローバル変数を取得するために使用します-このような単純な問題に対しては醜くてやり過ぎだと感じます。関数の真ん中に両方のオプションのコードがあり、そのうちの1つをコメントアウトします。または、関数do_stuff_Aとdo_stuff_Bを用意し、グローバル関数の内容に応じて、どちらを呼び出すかを変更し
needDebugInfo=True
ます。それは私が今やっていることですdebuginfo
が、再コンパイルせずに変更することはできず、実際に利用可能な最善の方法ではないはずです...
グローバルな可変状態は必要ないか、必要ありません-実行時に不変であるが、プログラムの起動時に何らかの方法で設定できる単純なグローバルフラグが必要です。オプションはありますか?