nobsun です。

> そういう観点から、ひとつシナリオをあげてみます。動的型付け、
> 可変長引数、状態変更有りな言語に慣れたプログラマがよく取る戦略です。
> 
> ある基本的な関数 (foo x y) というのがあって、それが大きな
> プログラムの中でたくさん呼ばれているとします。
> ある日、プログラマ D.Y.Namic氏は、(foo x y)の呼び出し
> の特定の場合に、付加的なパラメータzを渡してやると、非常に
> 効率があがるかもしれないと思い付きました。しかし、それを
> 検証するには、実際にコードを書いてみないと何ともいえません。
> そこでD.Y.Namic氏はfooのシグネチャを (foo x y &optional z)
> と変えて、とりあえず一つのモジュールについてのみ、zの使用を
> 検証してみます。他のモジュールでもfooはたくさん呼ばれており、
> 検証のためには他のモジュールも使う必要があるのですが、とりあえず
> それらはそのままにしておきます。
>
> 検証の結果、その変更は充分なメリットが認められたので、
> 旧来のモジュールも徐々にzを使うように変更し、全て変更し終わった
> ところでfooのシグネチャを (foo x y z) に変更しました。
> 
> さて、静的型付けに慣れた St. Atic 氏はどういった戦略を取る
> べきでしょう。

プログラマ St.Atic 氏の戦略はすこし違います。もともとの

 foo :: a -> b -> p より一般性のある

3引数関数

 foo-gen :: c -> a -> b -> p を考えます。

すべての関数はカリー化されるので、このシグネチャーは

 c -> (a -> b -> p) 

とも読めます。foo-gen に z を与えたものが、
foo と同じ仕事をする関数を生成するように、foo-gen を定義すればいいのです。
St.Atic 氏は、foo-gen を定義した上で、従来の foo の定義を

 foo = foo-gen z という定義に変えて、いろいろと実験をしました。

検証の結果その変更は充分なメリットが認められたので、
旧来のモジュールも徐々に foo x y とあるところを foo-gen z x y を
使うように変更しました。
 
私は、St.Atic 氏の戦略をとります。:-)

--nobsun


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/