関数、メソッド、ラムダってなに?

数学が本当に苦手なので、このあたりの違いがモヤモヤしたまま時間が数年過ぎた気がする。

Rubyはオブジェクト指向言語って言われる。

オブジェクト指向言語の世界では、オブジェクトがあって、メソッドがオブジェクトに生えている。
私たちが何かしたいと思ったら、オブジェクトに生えているメソッドをつっつけばいい。
オブジェクトは何ができるの?という疑問は、私たちは持たなくても大丈夫。
オブジェクトがどんなメソッドを持っているのか見ればいい

Rubyでは「名前重要」という文化があるので、メソッドの名前を見ればその動作がだいたいわかる。

一方で、関数はそういうわけにはいかない。
オブジェクトに、あなたに適応できる関数は何ですか?と聞いても「さあ…?」と言われる。
この世界のオペレータたる人間は、頭の中に関数リストを保有していて、それぞれの関数の具体的な操作内容をよく把握していなければならない。

ここからは想像の話になる。私はRubyが好きで数学が苦手である。Rubyの開発者は松本さんである。とあるインタビューによるとRubyの開発者の松本さんも学生時代に数学が苦手だそうである。だから私も松本さんもRubyが大好きで数学が苦手である。よって私はRubyは数学が苦手な人に親和性があるという仮説を持っている。Rubyプログラミングの特徴は、数学が苦手な人にやさしく設計されれているのではないか。

それが、Rubyでは人間が関数のリストを管理しなくてもよいという点だと思う。

Rubyでは、methodはオブジェクトではない。そのかわりProcというものがある。lambdaというものもある。
lambdaは使ってみるとたぶん結構便利なのだが、あまり使われていない。

それに対して、データサイエンスの世界の言語、JuliaやRでは、関数が一級市民である
Rでは、ライブラリーを読み込むと、トップレベルににょきにょきと関数をはやす。
Ruby市民としては、こんなにトップレベルに関数を生やして大丈夫なのかと心配になるほどだ。

コンピュータの中で実際に何がどう動いているかはともかく、私はRubyでオブジェクトのメソッドを呼ぶとき、
オブジェクトが主語となって、何かを処理しているようなイメージを持っている。プログラミングとはオブジェクトに司令を出すことである。
思うに、関数を実体として把握するのに向いている脳の人間と、そうじゃない人間がいる。

個人的には関数のざらつきみたいな質感を感じることができない。これが数学が苦手な理由だと思っている。
(でも物理は好きだ。そこでは力とか電磁場とか、何かしら実体の触れそうなものが登場するから。)

関数の主語は一体誰だろうか?オブジェクトが主語でない以上、コンピュータや人間が操作していると考えなければならない。
主語不在のまま操作だけの思考を進められるかどうかは、数学の特異と不得意の分かれ目になっているのかもしれない。

話は変わって、関数型言語では参照透過性とかいうのが尊ばれる。
参照透過性が何かっていうのはよくわかっていないが、Jupyter Notebookで、セルの実行順序を色々変更すると、結果がぐちゃぐちゃになるようなアレが発生しにくいことではないかと個人的に思っている。
Rubyのようにオブジェクト指向を追求している言語は、その性質上参照透過性が保障されにくいような気がするけどよく理解していないのでわからない。

最近はGitHubとか流行って、有限なリソースである「開発者をたくさん集めたら勝ち」みたいな風潮もあるけれども、Rubyがデータサイエンスや機械学習であまり普及しない理由はこういう基礎的なプログラミング言語の性質に求めるではないかという気がしている。開発者を集める話は、あまりおもしろく
ないからである。

個人的には便利すぎる map とlambda の関係の間には闇があって、それがデータサイエンス用のツールを作る上で大きな障害の一つになっていると思っている。データフレームDaruなどを見てそれを感じた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です