関数型プログラミングをHaskellで学ぼうと思う。

こんにちは、かずやです。

最初に触れたプログラミング言語はJava。その後、JavascriptやRubyを学びプログラミングに触れてきた自分にとって「オブジェクト指向言語」は随分見慣れたものとなりました。

ところが最近、”関数型”という新しい考え方があることを知ります。
副作用を削り、シンプルな関数を組み合わせることでプログラムを組み上げていくという考え方は、時に全く理解が及ばないほどに新しく、ぼくはついつい「面白そう…」と思ってしまいました。

そんなわけで、関数型言語の中でかなり有名どころな「Haskell」という言語を触ってみています。しらん文法がいろいろ出てきて、やったら理解が大変ですがなかなかに面白い。

しばらく継続的に触りながらアウトプットを出していこうと思うのですが、今日はとりあえず、関数型言語とは何なのか、関数型とはどういう考え方なのか、について簡単にまとめてみたいと思います。

関数型言語(Functional Language)とは

関数型言語は、まさしく名の通り「関数」を元にしてプログラムを組み上げていく言語になります。

ただしここでいう関数は、従来のプログラム言語が関数と呼ぶ「処理のカタマリ」と厳密には異なり、どちらかと言えば数学的な定義に近いものです。

簡単にいうと、関数型言語における関数とは「ある引数に対して必ずある値を返すもの」のこと。

例えば中学校くらいの数学で、

y = 2x

という関数を習ったと思います。

これはxに数値を与えれば、必ず2倍した値が得られるというものです。1を与えれば必ず2が得られますし、-100を与えれば、必ず-200が得られます。

このように「いつ、誰が、どういう条件で」値を与えたとしても「同一の値が返ってくる」のが関数の特徴です。

そして、そんな関数をプログラムのメインにおいたプログラミング言語が関数型言語なのです。

関数型とオブジェクト指向との違い

関数型の考え方を学ぶには、オブジェクト指向と比較するのが一番早いと思います。

オブジェクト指向は、それぞれのオブジェクトがステート(状態)を保持し、それをメソッド(処理)によって変化させるという手法を取ります。

しかし関数型ではステートとメソッドが分離します。

ステートをまとめて保持した上で、それを関数で処理することによって値を変更したり得たい情報を取得したりといったことをするのです。

(この辺、図解するとわかりやすいと思うので、そのうち図を追加しておきます)

これにより、

  1. ステートが一箇所にまとまっているためステートの変化を追いやすい
  2. 関数の処理を理解しやすい(受け取った値に対して値を返す、ということしかしないため)

といった利点を得ることができます。

ぼくは今、Haskellを用いて関数型を勉強してみていますが、実際にはJavascriptなどオブジェクト指向型とされている言語を使っても、関数型を学ぶことは可能です。

こちらのQiita記事なんかは、Javascriptを用いて関数型の考えをコード例とともに紹介しています。
手を動かして直感的に関数型を理解するのに役立つので、ぜひ読んでみてください。

関数型プログラミングはまず考え方から理解しよう

おまけ

関数型プログラミングを勉強するために、Haskellを触る必要は正直そんなにないと思います。

ステートと処理の分離や関数の概念を知っていれば「実際のプログラミングに関数型の考え方を役立てる」のは普通にできると思いますし、それで十分な気もします。

ぼくがHaskellを触っているのは、単純に「なんか新しい文法出てきてカッコエエ」って思ったから笑。

ぶっちゃけ↑が9割ですが、一応真面目な理由として「関数型の考え方に乗っ取らないとかけない」言語を学ぶことで関数型の思考を自分の中に取り入れやすくなるかな、と思ったのもあります。

しばらく触ってみる中で、その辺の考え方の変化も、書き留めておきたいなあと思いつつ。

ではではっ!

シェアする

  • このエントリーをはてなブックマークに追加

フォローする