cut-sea さんが、グローバル変数が欲しい理由?を書いて下さっています。大作をありがとうございます。(_ _) 2回読ませて頂きました。
cut-sea さんが、コマンドライン引数をグローバル変数にする必要がないと思うのは、まず以下のように考えるからですよね。
えっとオプションを取って,それによって振る舞いをかえたいんだからオプションに依存するんだろう.いやいや,それはフィルタプログラムの型じゃなくてフィルタプログラムを生成する関数か.
そして、そう考えることに対する安心感は、以下からきているのですよね?
genProgなんだけど,複数のオプションを同時に指定した時に死ぬよね.今の実装ではさ.でも,FilterProgramってString->Stringだからこれって閉じてるって感じしねぇ? SICPの言うところのClosure Propertyってやつね.あのクロージャじゃないよ.つまり普通に(.)で繋いじゃえばいいんじゃね?ってことですわ.そらそうですよね.フィルタなんだから,そうなるのが天然自然だわさ.
つまり、main に近い上位レベルにおいて、本体のプログラムを小さなプログラムから合成できると信じているのですね。
僕はまだ経験が少ないので、そう信じきることができません。
あと、別の問題ですが、本体のプログラムに行くまでにあまりに時間がかかっているような気がします。
C 言語が敬遠される理由の一つにコマンドライン・オプションの処理にたくさんのコードを書かないといけないというのがあると思います。スクリプト言語は、その辺りのコストを下げる努力をしていますね。
コマンドライン・オプションの処理をお手軽にできないと、Haskell の普及は難しそうでうです。
また、Haskell をかじったばかりの人には、今回の main は呪文に見えるでしょう。
main :: IO () main = getArgs >>= \argv -> let f = genProg opts opts = parseOpt argv inputs = getInputs opts in (runProg f) . concat =<< inputs
もっと初心者に分かりやすくしないと、脱落する人が多そうです。