カクカクしかじか

技術的なアレコレ

Rubyの関数的メソッドについて

はじめに

たまに関数型プログラミング言語の話題になるのですが、そもそもどういったものが関数的であるかについて自分自身理解していませんでした。
ここでは、Rubyの中で「関数的」と言われるメソッドの実行内容を見てみることでプログラミング言語の界隈で言われる「関数的」というニュアンスを少しでも理解出来ればと思います。

そもそも関数とは?

関数とは、コンピュータプログラム上で定義されるサブルーチンの一種で、数学の関数のように与えられた値(引数)を元に何らかの計算や処理を行い、結果を呼び出し元に返すもののこと。

e-words.jp

この場合の関数というのは、ある式に特定の値を与えてその計算結果をただ返すものというニュアンスでしょうか。次にRubyで「関数的」と言われるメソッドからRubyの世界での関数の解釈を見ていこうと思います。

Rubyでいう関数的メソッドとは?

レシーバがないメソッドを、関数的メソッドと呼びます。
もっとも、「レシーバがない」といっても、レシーバに該当するオブジェクトが本当にないわけではありません。
関数的メソッドの場合、それが省略されているのです。

(refs:たのしいRuby 第5版 p106)

関数的メソッドの例

blog.published? のようなレシーバーの情報を必要にするメソッドは関数的ではなく、レシーバーの情報を必要としないメソッドを関数的と呼ぶそうです。

$ p "hoge"
"hoge"
=> "hoge"

$ puts "hoge"
hoge
=> nil

$ sleep(5)
=> 5

まとめ

インスタンスメソッドは特定のクラスからnewされるインスタンスから呼び出すメソッドですが、関数型はこうしたクラスを軸にはしないためレシーバーを必要としないのかな?と思いました。
例えば、関数型言語と呼ばれるElixirにはクラスがないことからも、関数型はクラスベースではない考え方を指すのかなと勝手に理解していますが、もう少しElixirも深掘りしたら見えてくるかもしれないので、Rubyと並行してElixirも触ってみようと思います。