概念は、分離するべきなのか統合するべきなのか。多分正解はない。
ただ「関数」は様々な概念を包括しすぎではないだろうか。「全てが関数」というのは聞こえはいいが、考えてみればこれはその操作に本来備わっていたはずの直感を捨てていることに他ならない。 内部実装は全て関数で良いが、その表現には変える余地がある。
Haskellの例を見てみよう。
- 「二項演算子」という直感の表現として、
x `func` y
と表記することができる。また関数名を記号にすることでも表現できる。 - 「構築子」という直感は「先頭が大文字であること」が受け持っている。(これは完全ではないと思う。)
- 「処理」という直感は「モナド」が受け持っている。これには処理に定まるべき構造が入っている。
- lensでは「アクセス」という直感を美しい構造と共に導入してくれる。
x^.y.z
という表記は他言語でのアクセスと共通にも見える。
全てが関数であっても、実際のコード表現は異なるものであることがわかる。C++はどうだろうか?
- 「二項演算子」は関数名を記号にすることによって表現できる。
- 「構築子」はクラス名に関する適用や、
new
キーワードによって表現されている。 - 「処理」は関数そのものの一般的な利用法である。
- 「アクセス」は関数ではなく、そういう機能として備わっている。文法はもはや一般に受けいれられている。
悪いことは無い。
なんであれ「やりたいこと」と「やるべきこと」には差があって、「表現」と「実装」の差として現れるべきなのだと思う。 そして表現を分離し、実装を統合するのである。
別の話だが、実装で統合されてしまうとそれ以降の最適化などが難しくなってしまう点があると思う。これは言語として考える余地がある。