haskellにおけるincってなんだって話

何回かHaskellを学んでみようみたいなことを考えていて、ちょこちょこ入門をうたったサイトを見ていたりしました。
で、ずっと前からそうだったのですが、Haskellを学んでいる時に意味不明だった文章に以下のものがありました。
「add a b = a+bとしたとき、inc = add 1とすれば"inc"は1を足すという関数を返す関数」
何者だよ、関数を返す関数とは・・・。で、それに関して色々考えてて、自分なりにそれなりに納得したので
それについて書いてみようと思います。

本文を書く前に、この文章はHaskellどころか、関数型言語をほとんど知らないバカが書いています。
なので、Haskell等、言語を極められた方からすると、不正確、曖昧な表現があるかもしれませんが、あまり
怒らないでいただけると幸いです。それから、コレから書くことはとてもとても当たり前なことなのだと
思うのですが、あまりこういう書き方をした文章を見たことがないので書きました。当たり前じゃん!
何をいまさら!と思っても許してください。

さて、"inc a"について書く前に、そもそもHaskellってどんな風に計算を行っているのでしょうか。
ということを考えます。C言語などは、ある変数に数字を代入して、それを計算式でいじって計算を
行いますが、Haskellはおそらく違います(本当に違うのかは議論がある所でしょうが)。
端的に言うと「式に式を代入しまくって、最後に出てきた、式を答えとしている」
例えば「x=y+z」「y=1」「z=6」という3つの式が定義されていた時に
「xを計算してください」というプログラムが書かれたら
「x」→「y+z」(式をそのまま置き換えただけ)→「1+6」→「7」
日本語で書くとxにy+zを代入、yに1を代入、zに6を代入して、最終的に「1+6」が出てきて
「7」という答えが帰ってきます。
次にもうちょっと思考を変えます。ここからzの定義を抜いたらどうなるでしょうか。
「1+z」という式が現れて、それ以上計算できなくなってしまいますね。
しかし、これで良いのです。上記した通り、別に答えは値である必要は無く、式でも良いのですから。
「1+z」が答えになるのです。数学でも変数が答えに入ってることは別に不思議ではないです。
では、もっと変則パターン、「x=y+」という定義になっていたらどうなるでしょう。
「x」→「y+」→「1+」(ただ単に定義に従って置き換えただけ)
「1+」というのは、数学的にはとても気持ち悪いですが、まぁ数式に変わりはないので、
コレが答えだということに異論は無いでしょう。
最後のパターン、「x=y+」という定義のもと、「xzを計算しろ」と言われたらどうなるか、置き換えてみましょう。
「xz」→「"y+"z」→「1+6」→「7」
どうでしょうか。xzはかけ算ではと言われるかもしれませんが、ここでは演算子は省略できないものとしてください。
そうすれば、割合納得できる”置き換え”なのではないでしょうか。
ここで本題に戻ります。"inc"とは何なのでしょうか。答えは、置き換えると"add 1"になるものです。
プログラムの例を見てみます。
「add 1 2」→「1+2」(式をそのまま置き換えただけ)→「3」
「inc 2」→「"add 1" 2」→「1+2」→「3」
どうでしょうか、あまり変な感じがせずに受け入れられたのではないでしょうか。
「関数を返す」と言われるとすごく違和感のある表現ですが、単に置き換えたら良いです、と言われると
割合納得しやすいものなのではないでしょうか。
で、ここでHaskellのプログラムにおいて、「=」を置き換え規則だと見ると、結構すっきりすることが
たくさん有るのではないでしょうか。言いたいことはこれで全部です。

最後に重ねて言いますが、僕全然Haskellのこと知らないので、この文章の正当性は非常に怪しいです。
しかしまぁ、そこそこ感覚的で分かりやすいのではないでしょうか。
この文章が、今後Haskellを学ばれる方の一助になることを祈りつつ。
ではでは。