体験を伝える―『ガジェット通信』の考え方

面白いものを探しにいこう 本物を体験し体感しよう 会いたい人に会いに行こう 見たことのないものを見に行こう そしてそれをやわらかくみんなに伝えよう [→ガジェ通についてもっと詳しく] [→ガジェット通信フロアについて]

今さら聞けない!関数型プログラミングとは【初心者向け】

関数型プログラミング言語について詳しく解説しています。

他の言語と比較して何が便利なのか、どんなサービスに使われているのか気になる人は多いのではないでしょうか。

実際の開発現場でも採用し始めている企業が増えているので、これから学習しようと思っている人はぜひ特徴を知っておきましょう。

 

関数型プログラミングとは

Java、JavaScript、PHP、Rubyなどの多くのメジャーな言語は命令型プログラミングと呼ばれる言語です。

オブジェクト指向言語も命令型プログラミングに含まれます。

では、いったい関数型プログラミングとは何なのでしょうか。

 

関数型プログラミングでは命令型プログラミングとは違って、基本的に関数のみで記述していきます。

for文などの文も関数で代用できるのです。

これにより、命令型プログラミングとは違い、問題を解く手順ではなく、問題の性質を表すことができます。

より数学に近い表現で書けるため、研究者たちに好まれて使われてきました。

 

関数型プログラミングのメリット

数学的に書ける

前述した通り、数学的に書けるので、研究目的で力を発揮します。

 

拡張性が高い

命令型プログラミング言語では関数やクラスを定義することはできても、言語自体の機能を拡張することはできません。

関数型プログラミング言語は拡張性が高く、プログラミングの文法自体を変更することも可能です。

 

副作用が少ない

オブジェクト指向プログラミングでは、生成されたインスタンスをメソッドによって操作できます。

操作を繰り返しているうちに、インスタンスの中の変数の値が変わっていきます。

それに伴って、メソッドの入力に対して返ってくる出力の値も変わっていきます。

このような現象を副作用と呼びます。

 

関数型プログラミングで書けば、このような副作用を起こしにくくなります。

副作用が無ければ、入力に対していつでも同じ出力が返ってくるので、シンプルなプログラムを書くことができます。

 

遅延評価

遅延評価とは不必要な計算を省略するための、計算結果を使い回す仕組みです。

そのため、遅延評価の関数型プログラミング言語は同じ計算が何度も登場するような処理を素早く終えることができます。

 

関数型プログラミングのデメリット

環境に依存しやすい

関数型プログラミング言語は拡張性が高い反面、拡張することでそれぞれの方言ができてしまいます。

すると、自分の環境では動かせるプログラムでも、他の環境では動かないということが起こります。

そのため、関数型プログラミング言語のLISPではCommon LispやSchemeなどの標準化の動きが進みました。

 

状態遷移の処理が書きにくい

副作用が少ないことはメリットではあるのですが、状態遷移の処理を記述するのが難しくなります。

ここでいう状態遷移とは前の計算結果を引き継いで、さらに計算をするような処理です。

 

例えば、対戦ゲームの体力値を考えてみましょう。

相手に攻撃をすると、相手の体力が攻撃値だけマイナスになります。

攻撃を重ねると、徐々に体力が減っていきます。

つまり、前の体力値を引き継いで、さらに攻撃値を体力から引く計算をしているのです。

 

ところが、関数型プログラミング言語の関数はいつでも同じ値を返すので、前の計算結果を引き継ぐことができません。

このような処理を実現するためには、関数が返した値をさらに関数に渡してあげるという記述をしなければいけません。

 

関数型言語の種類

Scala

ScalaはJVM上で動作するオブジェクト指向言語と数型プログラミング言語の二つの特徴を持った言語です。

Javaのライブラリを使用することができます。

JVM上で動く言語は他にもClojureやF#などがあります。

Twitterのバックエンドで使われたり、LinkedInで利用されています。

 

Erlang

Erlangは特に並行処理を記述するのに優れています。

並行処理とは複数の処理を同時に行うことです。

もともとはエリクソン社内で開発されていたものがオープンソースとして公開されました。

LINEやWhatsAppで採用されています。

 

Haskell

Haskellは純粋関数型プログラミング言語と呼ばれ、メジャーな言語とは文法がかけ離れています。

習得のハードルは高いですが、保守性の高いコードを書くことができます。

また、Haskellは遅延評価を備えています。

一部の金融システムに導入されていてますが、あまり実用化は活発ではありません。

 

以上、関数型プログラミング言語について紹介しました。

その使いやすさから他の言語から移行する企業も増えています。これから採用しようと考えている企業も多いはずなので、ぜひ一度勉強してみてください。

 

TechAcademyでは、IT企業・SI企業で勤務経験のある20代・30代のエンジニア向けに8週間でScalaエンジニアを目指せるScala転職支援コースを開催しています。

現役エンジニアのメンターに毎日質問することができます。独学に限界を感じている場合はご検討ください。

TechAcademyマガジンの記事一覧をみる
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。