前回の日記では使う側視点でカリー化して何が嬉しいんや… → 抽象度が上がってごにょごにょ…
みたいなことを書いていたけど、言語側から見た場合、言語仕様として複数引数の関数をサポートしなくても単一引数の関数と高階関数があれば事足りるという面もあるのか、と思い至った。
そう思ってプログラミングHaskellをまた読んでみるとこういう書き方がしてあった(p25, 3.6 カリー化された関数)。
タプル以外にも関数が複数の引数を処理できる方法がある。
ひょっとしてHaskellって1引数の関数しかサポートしてない? と思ったら、Wikipediaにはこうあった。
特にMLとHaskellでは関数は常に一つの引数のみを取り、複数の引数を取る関数とは、単にネストされた複数の一引数関数の糖衣構文にすぎない。
なるほどー。
そんな感じでじわじわとそこらへんの事情を知ったわけですが、「すごいHaskellたのしく学ぼう!」(最近読み始めた)ではこのように書かれていた(p61)。
Haskellのすべての関数は、公式には引数を1つだけ取ることになっています。しかし、これまでの章で複数の引数を取る関数を定義してきました。どうなっているんでしょうか?
実は、巧妙な仕掛けがあるんです! 複数の引数を受け取れるかのように見えた関数は、実はすべてカリー化された関数だったのです。
うむうむ。
すごいHaskellたのしく学ぼう! | |
Miran Lipovača 田中 英行 オーム社 2012-05-23 売り上げランキング : 13667 Amazonで詳しく見る by G-Tools |