ホントはこわくない関数型言語 〜関数型言語の学び方〜

ホントはこわくない関数型言語 〜関数型言語の学び方〜

関数型言語が気になるけど難しそう。そんなふうに思ってる人は多いと思います。 ここでは初心者に毛が生えた程度の自分が感じる関数型言語を使うメリットを説明したいと思います。

関数型言語の嬉しいポイント

ぬるぽがなくなる

「意識してれば」という条件付きですが、null参照が発生することはなくなります。 通常「値がない」ことを表現するためにnullを使用することが多いと思いますが、注意深くコーディングしないとすぐにnull参照してしまいます。 そもそも「値がない」ことを示すのにnullを便宜的に代用しているのが問題なのです。 ならば「値がない」ことを特別な方法によって表現できればより「値がない」ことを意識してプログラミングできると思いませんか。 関数型言語はoption型とパターンマッチによってこの問題を解決します。

パターンマッチ

パターンマッチをつかうことであるデータ構造から条件にあった値を取り出す、ということが柔軟で安全に可能です。 例えばうっかり配列(リスト)の境界外にアクセスしてしまって実行時例外になってしまう、ということもパターンマッチでは防げます。 それ以外でも様々な条件分岐を簡潔に強力にできる仕組みなので是非覚えてもらうことをおすすめします。

型推論による簡潔な記述

普段Javaを書いていると変数一つを宣言するにも型を書かなければいけません。 とても面倒な思いをしていませんか? Rubyみたいな動的型付のプログラミング言語を使えば記述が簡単になりますが、これでは実際に動かしてみないとどういうオブジェクトなのかわかりません。 そういった言語ではテストコードを書かなければ動作を保証できません。 関数型言語では型推論によって必要最低限(かは選択する言語によって代わりますが)の型を記述するだけでコンパイラがチェックしてくれます。 静的に型が付けられるメリットとソースコード上の記述量を削減できるという両方のメリットを受けられます。

関数型言語を理解するためのポイント

関数とはなにか

これは以下の書籍を読んでもらうのが手っ取り早いです。

オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門
オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門

ポイントとしては関数は値と同じ扱いであるため、関数に引数として渡したり、戻り値として受け取ったりできます。 その結果、呼び出した先の関数内で行われる処理を、呼び出し側で指定することができるのです。 それらを組み合わせることで処理の抽象化ができるようになります。関数型言語を使うことでデータ構造と処理をきれいにわけて考えることができます。

再帰的とはなにか

これは以下の書籍を読んでもらうと理解しやすいです。

プログラミングの基礎 (Computer Science Library)
プログラミングの基礎 (Computer Science Library)

再帰的という言葉は関数とデータ構造に使われます。 「大きな問題を小さく分けて考える」ことがポイントです。 ドミノ倒しをイメージしてみてください。全体では大きなドミノも始まりは1つの牌を倒すことから動きます。 それと同じように再帰的な関数も、大きなデータ構造を小さな単位に分割して処理することで実現されます。

最初は気にしないほうがよいポイント

モナド

Haskellではちょっとした入出力をするのにIOモナド(アクション)という特殊な仕組みを使います。 初心者には意味不明、というか自分もよくわかっていませんが最初からモナドを理解しようとすると痛い目にあいます。 しかしそんな理由でHaskellひいては関数型言語に抵抗感をもつのは実にもったいないことです。 わからなかったら最初のうちはとりあえず脇においておきましょう。

副作用

副作用がないプログラムを書くことでテストも書きやすくなりバグも少なくなります。 しかし現実的なアプリケーションで副作用なしに存在することはできません。 そこの折り合いをつけてプログラミングすることが大切です。

数学的な知識

数学的な素養がなくてもパターンマッチや型推論は便利に使えます。 あった方が望ましいとは思いますがそれを理由に使わない理由はありません。

これから学ぶ人へのおすすめ

オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門

オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門
オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門

Scalaを使って関数型言語を解説しています。 Amazonの書評では微妙な評価ですが初めての人が関数型言語を学ぶにはよくまとまっていると思います。 Javaとの対比で書かれているのでJavaプログラマの人におすすめです。 ※間違ってもScala入門の本ではないと思います

プログラミングの基礎

プログラミングの基礎 (Computer Science Library)
プログラミングの基礎 (Computer Science Library)

まったくのプログラミング初心者の人を対象にしています。 おそらく日本の関数型言語の本ではもっとも丁寧に解説している一冊です。 Ocamlを例にしていますがOcamlに興味がない人でも関数型言語への入り口として十分有効な本です。 ただしoption型は最後の方でちょろっと触れられているだけなので注意が必要です。

プログラミングHaskell

プログラミングHaskell
プログラミングHaskell

プログラミングHaskell なぜかサンプルコードがHaskellではなくてメタ記号が使われていたり、非推奨のn+kパターンを多用してたりといろいろ難しいところはありますが勉強になります。 最後の章だけはすごく難しいらしいので自分はスルーしました。 付録Cは最初に目を通してよくとよいかも。

ふつうのHaskell

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門

ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門 難しいイメージのあるHaskellを実際にコマンドをつくって動かしながら理解しようという本。 最初の方の例で特に説明なくIOモナド(アクション)は関数とは違うと言われてなんのこっちゃと理解が進まなくなりそうですが、プログラミングHaskellと一緒に読んで理解しましょう。

実践F

実践 F# 関数型プログラミング入門
実践 F# 関数型プログラミング入門

.NETの人はF#というOcamlをベースにした言語がありますので使いましょう。 関数型言語を使いつつ.NETのクラスライブラリを使える素敵言語です。