HaHaHa!(old)

2009-01-13

グローバル変数(続)

Haskell でグローバル変数が欲しい理由 - あどけない話にコメントしたものにコメントがありましたが、コメント欄に大量に書くのは読みにくいかもしれないので、コメントへのコメントへのコメントではありますが、こちらに書いてしまいます。

...、直観的に言えば、煩雑で面倒だろうなと思います。

argvをグローバル変数として

main = putStr func1

func1 = func2
func2 = func3
func3 = func4
func4 = if "-c" `elem` argv then "ASCII" else "HEX"

と書くのと

main = putStr . func1 . elem "-c" =<< getArgs

func1 = func2
func2 = func3
func3 = func4
func4 cflag = if cflag then "ASCII" else "HEX"

と書くのとで煩雑、面倒という点での違いがわかりませんでした。

私の場合、値が変化する変数が嫌だなと思う理由は、考えなければいけないことが多くなって面倒で煩雑だからです。Haskellでは変数は「変」数ではなく、値(を表わす式)についた名前です。したがって、同じ有効範囲では、名前はいつでも同じ値でないと面倒で煩雑なのです。何かの値に応じて変化するものであるなら、その何かをパラメータとして関数で表現します。そういう原則に反したコードがあると読むのが苦痛になります。

自分が書くときは、好き嫌い以前に、そもそも欲しいとか、ないと煩雑だとか面倒だとか思わないのです。これはHaskellで書く習慣がついたからだろうと思っています。どうしてグローバル変数が欲しいのか、それがないと煩雑、面倒だという感覚を忘れていまっているのです。それで逆に興味があったわけです。

コマンドラインオプションは*不変*の環境であり、どの関数からも直接アクセスできてしかるべきだ、...

コマンドラインオプションが実際に渡ってきたところ、つまり main の中では*不変*の環境ですが、main の外ではそうではないですよね。

値が変わりうるグローバル変数は忌み嫌われますが、グローバル定数を嫌う理由はないと思っています。

私は、グローバル定数を嫌うわけではなくて(Haskellではトップレベルの名前はすべてグローバル定数です)、コマンドラインオプションはグローバル定数ではないという感覚をもっているので違和感があるわけです。

AkiraAkira2012/07/24 07:33Your articles are for when it abosluetly, positively, needs to be understood overnight.