somemo's diary

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【関数型】いろいろまとめ

関数型について有益そうな情報をまとめてみました。

触れた経緯

以下のような流れでした。

学んでみて

今まで学んだ手続き型、オブジェクト指向型とはまったく違っています。よく、頭の中から今まで学んだ概念を捨てて取り組むとありますが、まさにそのとおりでした。自分の率直な感想としては、とても数学的な考えを持ってみると分かりやすいと思います。

関数に対して、データを渡して処理をしてもらうことに変わりはありません。また、関数に対してデータと、そのデータに対して処理を行いたい関数を渡したりもできます。Javascriptの関数オブジェクトやコールバック関数に慣れているとすんなりいくと思います。つまり、関数がデータと同じように第一級であることがわかります。

驚いたことといえば、変数に対する再代入を行わないことです。繰り返しなどの処理を行うときには、indexを使いますが、それを関数の再帰で行うことが多いです。再帰を行うということは、階乗やフィボナッチ数列のように定理や定義によって関数が構成されます。これに対して思ったことは、定理と定義があることにより、とても見通しが良いことでした。if文などによる判断ではなく単純に定理であるためです。if文での判断による定理の実装は行いませんが、論理は存在しますので、ifやswitchのような判断は行えます。このように、定理、定義、命題や論理、さらには数学的帰納法などを思い出しながら関数型に慣れることができました。

また、データに対する型が存在するので、自然と引数・戻り値にも型があることが分かります。つまり、関数にも、引数と戻り値の型によって型が存在することになります。

これら以外に、関数を返す関数やクロージャ、カリー化、部分適用に関数の合成(コンビネータ)など、いろいろな用語がありますが他の記事などを参照してください。

純粋・非純粋

関数型の中には、関数型だけを扱うものとオブジェクト指向も扱うものがあります。Haskellは純粋であり、Scalaは非純粋だそうです。ScalaJavaのライブラリを使ったり、オブジェクト指向でかけたりします。また、F#という.NET上で動く非純粋な関数型言語もあります。C#に関数型の考えを組み込むのではなく、C#の補完としてF#を使うような関係だそうです。

静的・動的

さらに、型に関しても分別があります。今まであげた言語は静的です。ただし、途中省略しても型推論によって決められることもあるようです。動的な言語には、ClojureScheme(一部では違うとされている?)があります。静的・動的に関する記事はあまり見ないのであとでまとめてみたいと思います。

まとめ

かなーり殴り書きですが、こんな感じです。まずはHaskellHaskellについてではなく関数型についてきちんと学んでいこうと思います。次にScalaなどがなぜオブジェクト指向も取り入れる(ハイブリッド)のかについて調べられたらと思います。最後に、JavaC#とLLのように、関数型の静的・動的にはそれぞれのどんなメリットがあるかを考えていけたらと思います。一番大切なのは、2番目を知ることで、それを知るために1番目を理解することですね。

参考