或阿呆のブログ

巷では、武器商人@ダーツで通っています。Python好き好きプログラマーです。芥川龍之介、太宰治が好きです。

関数って何?

プログラマの心得じゃなくなってしまっているが・・・。

C言語の関数と言えば、C言語を知っている人なら通じる。C++のメソッドと言えば、クラスが持つ手続きのことなんだとわかる。C++のメソッドは関数か?と言われると、なんとなくニュアンスが違うような気がする。

じゃぁ、関数って何なの?定義は?

wikipediaで上手い説明を見つけた。
wikipedia:関数

二つの変数 x と y があり、入力 x に対して、出力 y の値を決定する規則(x に特定の値を代入するごとに y の値が確定する)が与えられているとき、変数 y を「x を独立変数 (independent variable) とする関数」或いは簡単に「x の関数」という。

C言語風に言うと、引数を与えて、呼び出すことによって戻り値を得られるものと言えるかもしれない。その定義の元に解釈すると(もっとも関数はもっと広義なのかもしれないけど)、returnしないものは関数じゃない。引数が無いものは関数じゃないとも言えるかもしれない。

そして、関数型言語と言うと、こんな書き方になるんじゃないかと。

func(func1(func2(1)))

みたいな。関数型言語では、もうちょっと簡潔でわかりやすい表現は出来ると思う。んで、C言語でも上記のような実装は可能だと思う。あんまり読みやすいとは言えないけど・・・。C++でも出来る。

これの何が良いかと言うと、関数は引数を与えられて、値を返していること。関数単位での評価(functionテストみたいな)がめちゃくちゃ楽だということ。プログラムの分割が非常に用意だということだ。オブジェクト指向の言語だと、依存関係があったりして、プログラムの分割が困難なことが多い。継承だとか、コンポジットしていたら、クラスを修正するのすら困難なことが多い。関数型言語だと、比較的容易に修正が出来る。関数をただ呼びかえればよいとか、分岐させれば良いとか。デメリットとしては、表現方法が複雑になりやすいことと、実装が面倒なパターンがあることかな。

そんなこんなも合って、関数型言語のテクニックを知りたいと思って、Haskellなんかをさわりはじめたわけだけど。