初心者向けに関数型プログラミングとは何か詳しく解説しています。企業でも採用し始めている関数型言語ですが、一体どんな特徴があり他の言語と比べてどんなメリット・デメリットがあるのか説明しています。代表的な関数型言語も覚えておきましょう。[テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。この記事では、関数型プログラミングとは何なのか、解説しています。関数型言語は、効率よく開発できる言語として採用している企業も増えてきています。言語の特徴やどんなメリットデメリットがあるのか理解しておきましょう。本記事は、TechAcademyのScalaオンライン講座の内容をもとに作成しています。今回は関数型プログラミングについて勉強してみよう。関数の組み合わせによってプログラムを構成していく手法を指して言うんだ。例を見ながら紹介していこう。関数型プログラミングとは関数型プログラミングのメリット関数型プログラミングのデメリット関数型言語とは関数型プログラミングとは関数型プログラミングとは、解決しようとする問題に対し、その問題の性質を関数の組み合わせで記述するプログラミング手法です。これに対し、命令型プログラミングでは、問題を解く手順をコンピュータが実行すべき命令の列として記述します。言葉だけでは分かりづらいので、例を見ていきましょう。種別(category)と価格(price)を持つ商品(Item)のリストから、食品(種別がFoodsのもの)の合計金額を計算するメソッドを考えます。Javaで記述した場合の命令型プログラミングのサンプルです。totalPrice;}この処理の中では、変数iは商品リストの何番目を処理しているか、変数totalPriceは現在計算が完了している合計金額がいくらになっているか、というプログラムの状態を表します。変数iは、ループが行われるごとにi+という命令文によって、現在のiに1を足した値が代入されます。)という命令文によって、ループ中の商品の価格を足した値が代入されます。このように、プログラムの状態を表す変数の値を代入命令で変更していき、最終的に目的を達成することは命令型プログラミングの基本的な流れになります。次に、Scalaを使用して同じ処理を関数型スタイルで実装した場合のサンプルです。totalFoodsPrice(otherItems)}このメソッドは入力として商品リストを受け取り、先頭が食品であれば残りの商品リストの合計金額に価格を足し、そうでない場合は残りの商品リストの合計金額をそのまま返す、という内容になっています。馴染みが無い方には分かりづらくなったように思われるかもしれませんが、このメソッド内には変数の初期化や代入といった命令文が存在しません。現在は何番目の商品を扱っているか、現在の合計金額はいくらか、といった状態はここには現れないということです。状態を変化させながらループさせるという手段の代わりに、すべての商品に対する繰り返し処理は同じメソッドを再帰的に呼び出すことで実現しています。再帰処理をすることが重要なのではなく、状態を扱わないということが重要で、実現方法は他にも存在します。状態をプログラムの中で扱い、変化させていくことは、プログラムの動作を分かりづらくさせたり、テストやデバッグを困難にする原因となります。これを避け、プログラムの状態を変化させない関数を作成し、これを組み合わせて(上記の例では再帰的に呼び出して)問題解決を行う手法が関数型プログラミングです。ここで、変数の再代入や入出力などによってプログラムの状態が変化することを副作用と言い、副作用を持たない関数を純粋関数と呼びます。基本的な特徴についてだね。大石ゆかりJavaとScalaを比較してみると、目的に対する手順が違っているのが分かりますね。次に、関数型プログラミングにはどういったメリットやデメリットがあるのかについて見てみよう。関数型プログラミングのメリットプログラムの分かりやすさ関数型プログラミングの最大のメリットは、プログラムが人間にとって分かりやすくなるという点です。命令型で書かれたプログラムは、人間に対する分かりやすさよりコンピュータにとっての分かりやすさが優先されています。コンピュータにとって、実行中のプログラムの状態が明確であることは重要なポイントです。人間が本来関心を持つのは実行中のプログラムの状態ではなく、プログラムに対する入力とその実行結果です。関数型プログラミングでは、入力に対して必要な結果を導く関数を用意し、組み合わせていきます。関数の内容は実行中のプログラムの状態からは独立したものとなり、より人間の思考に近く、書く側にとっても読む側にとっても分かりやすいものとなります。テストのしやすさ関数型プログラミングでは、関数に対して同じ入力から等しい実行結果が得られるため、テストがしやすくなるというメリットもあります。これは、正確には関数型プログラミングのメリットというよりは副作用を抑えるプログラムのメリットで、命令型プログラミングでも意識して設計すれば得られるメリットです。実際、命令型プログラミングでもテストのしやすさを重視し、副作用に気を配っているという方も少なくないと思います。関数型プログラミングでは純粋関数を宣言して組み合わせることが基本になるため、このメリットをより自然に受けることができます。関数型プログラミングのデメリットパフォーマンスチューニングが難しい命令型プログラミングでは、1行ずつどういった命令をコンピュータが行なっているかが明確なので、比較的パフォーマンスチューニングが行いやすいと言えます。これに対し、関数型プログラミングでは、コンピュータが実際に実行する1つ1つの命令を把握するのは難しく、命令型プログラミングほどチューニングは容易ではありません。無理にチューニングすることで、関数型としては不自然なコードになってしまう場合もあります。誤解してはならないのは、関数型プログラミングでは実行速度が遅い、ということは決してなく、広く使われている関数型言語は多くの命令型言語と比べても遜色ない実行速度を備えています。CやC++、あるいはFORTRANが選ばれるような、限界までハードウェアの性能を引き出すことが必要な用途で関数型プログラミングを使用することは、現実的とは言えません。世の中の多くのソフトウェアはそこまでの性能は必要なく、開発効率やメンテナンス性の方が重要になります。このような多くの分野では、関数型プログラミングは有効な手段となります。関数型言語とは関数型言語とは、関数型プログラミングを行うことを推奨して設計されているプログラミング言語です。関数型言語でなければ関数型プログラミングが行えない関数型言語では命令型のプログラミングを行うことができないこの2点は誤りです。関数型プログラミングを実現すること自体は、多くのプログラミング言語で可能です。逆に、関数型言語と呼ばれる言語でも命令型のプログラミングを行うことができます。一般に関数型言語と呼ばれる言語には、言語の設計段階から関数型プログラミングの実現を補助するための多くの言語機能が用意されており、それらを使って関数型プログラミングを行うことが前提となっています。「この言語機能があれば関数型言語である」という定義があるわけではありませんが、この特性によって関数型言語で作成した関数型プログラミングは非常にシンプルで自然なものとなります。関数型言語にはさらに純粋関数型言語と非純粋関数型言語の2種類が存在します。純粋関数型言語では、すべての式や関数が純粋関数のみで構成されます。一方で、実用性や既存言語との相互運用性を考慮し、副作用を持つ関数を許容する言語も多く存在し、これらは非純粋関数型言語と呼ばれます。この2種類は、どちらかが優れているというものではなく、その言語が目指す方向性の違いによって異なっているものです。主な関数型言語Scalaオブジェクト指向言語と関数型言語の特性を併せ持つ、マルチパラダイムの関数型言語です。2つの言語特性を1つの概念として統合することにより、小さなスクリプトから大きなシステムまで同じ概念で実現できるスケーラブルな言語仕様が特徴です。Java仮想マシン(JVM)上で動作し、既存のJavaプログラムやJavaライブラリと容易に連携できることも特徴で、広く使われてきたJavaの資産を有効に活用することができます。TwitterがScalaを大規模に採用しているほか、国内でもChatWorkやBacklogなどScalaへの移行事例が増えてきています。ScalaHaskell純粋関数型言語と言える言語です。純粋関数型言語でありながら入出力のような副作用を伴う操作を実現するためにモナドという機能を持ち、その他にも多くの先進的なプログラミング機能を持っています。その結果、言語の仕様に従うことで、「良い関数型プログラミング」となるような実装を行いやすくなっています。Capital社が金融商品の高頻度取引システムで使用するなど、信頼性の求められる分野でも広く使用されています。HaskellErlangエリクソン社が自社用に開発し、のちにオープンソースとして公開した関数型言語です。VM)上で大量のプロセスを実行するための並行処理プログラミングをサポートする言語機能を持っています。Legendsというゲームのチャットシステムなど、主に大量のリクエストをリアルタイムで処理する分野で採用されています。Erlang以上、関数型プログラミングについて解説しました。関数型言語を採用し始めている企業も増えていますが、どんな特徴を持った言語なのか知っておくと良いでしょう。最後に、関数型言語をいくつか挙げてみたよ。大石ゆかりScalaが非純粋関数型なのに対して、純粋な関数型言語というのも存在するんですね。田島悠介Haskellなどは純粋関数型言語の代表的な例になるね。関数型を使うことによってどのような利点があるのかを考えながらその特徴を捉えていこう。大石ゆかり分かりました。ありがとうございます!オンラインのプログラミングスクールTechAcademyでは、Scalaオンライン講座を開催しています。Scalaを使ってWebアプリケーションを開発することができます。現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。金澤秀知(かなざわひでとも)フリーランスのITエンジニア開発実績:大量の調査画像を分類するシステムの開発、業務用の人材管理アプリケーション開発、アクティブ・ラーニング用スマートフォンアプリ開発など主にJava・Scalaを用いたサーバサイドプログラミングを中心としつつ、AWS・Azure・Firebaseなどのクラウドプラットフォームを使ったアーキテクチャ設計も行ってきた。開発にともなう課題として、自動テストを用いたソフトウェアの品質向上にも取り組んでいる。現在は高知県に住み、リモートワークを使った働き方を実践中。今回は、Scalaでarrayを使う方法を解説します。配列を扱う上で大事な知識なので、実際に書きながら理解していきましょう。...Scalaセプテーニ・オリジナルのCTOが語る!開発言語にScalaを採用した理由とは今回は、全社でScalaの導入を進める株式会社セプテーニ・オリジナルとコミックスマート株式会社のCTOとして働かれている杉谷保幸さんにお話を伺いました。今回は、Scalaでlistを扱う方法を解説します。今回は、Scalaでoptionを使う方法を解説します。今回は、Scalaを習得したい人におすすめの本10選を紹介します。これからScalaを学びたいと思っている人は、ぜひ一冊持っておくと良いでしょう。今回は、Scalaでforeach文を使う方法を解説します。ループ処理ではfor文もありますが、for文との書き方の違いについても理解しておきましょう。今回は、プログラミング言語として注目されてきている「Scala」について解説します。関数型言語として採用する企業も増えてきています。Scalaとはどんな言語なのか、他の言語と比較して何が優れているのか知っておきましょう。本記事は、TechAcademyのScalaオンライン講座の内容をもとに作成しています。ここではScalaという言語について勉強していこう。最初に、オブジェクト指向と関数型プログラミングの両方を扱う言語であるということから説明していこう。Javaとの関係についても解説するよ。Scalaではオブジェクト指向と関数型プログラミングの両方を扱うことができます。オブジェクト指向とは、仕様の変更に対して柔軟にプログラムを実装することができる手法です。オブジェクト指向はクラスという概念とともに理解していく必要があります。関数型プログラミングは、関数の組み合わせでプログラムを作り上げます。求人検索エンジンスタンバイが発表したプログラミング言語別平均年収では、Scalaが626万円と第1位に選ばれています。Scalaを採用する企業は増えていても、Scalaエンジニアはまだまだ少ないです。これからエンジニアを目指す人もエンジニアとしてキャリアアップしたい人もScalaを学ぶメリットは大きいでしょう。Scalaは、Javaのライブラリのほとんどをシームレスに利用することができます。ライブラリとは、よく使う機能をあらかじめ実装した状態でまとめてある便利機能です。Machine)上で動作するためです。JVMはJavaの仮想マシンのことです。Scalaで作られたものには様々なものがあります。有名なWebサービスであるTwitterやLinkedinでもScalaを使用して実装されています。国内でもChatworkやビズリーチなどがScalaを採用しています。他にも、人工知能に関する実装にもScalaを使用していることがあります。Scalaの主な特徴についてだね。Javaのライブラリを使うことができるので、Javaを習得している人にとっても使いやすそうですね。次にScalaを使うメリットと、開発環境についても紹介していこう。JVM上で動作することは、MacやWindowsやLinux等JVMが動作していればどのOSにおいても実行可能ということです。JVM上で動作するということは、当然Javaの資産ともいえるライブラリを利用可能です。Javaという言語は20年以上業務システムの現場で利用されています。サン・マイクロシステムズという企業から始まり、現在はオラクルという会社の元で管理されている言語です。多くの業務システムで作られたライブラリが存在するということは、そのライブラリを利用することで、再度その部分の実装をする必要が無いということです。実装する手間を少なくするという大きなメリットがあります。ScalaにはPlay2というフレームワークがあります。Play2フレームワークはJavaでも利用することが可能です。フレームワークとは、よく使用する実装方法を柔軟にかつ簡単に実装する方法をあらかじめ用意してくれている枠組みです。Frameworkや、Twitterで開発されているFinagleがあります。これらフレームワークが存在することは、開発効率を格段に向上することになります。Scalaは静的型付き言語です。静的型付き言語とは、変数や、引数や返り値などの値の型が、プログラムの実行よりも前に仕様として実装済みと言うことです。変数とは値を格納するはこのようなものです。引数は、関数という命令の塊を実行する際に必要とする値です。戻り値は、関数を実行した後に生成される値です。これらが、プログラム実行前に実装済みということは、どの値がどのように利用されるか予め決められているということになります。その結果、エラーの発生する可能性を未然に防ぐことができます。IDEAという統合開発環境(IDE)を使用します。IDEAは有料ソフトですが、無料の範囲内でも利用が可能です。IDEAをインストールすることでScalaもインストールすることができ、簡単にScalaの開発環境を整えることができます。IDEAの国内代理店サムライズムでは、国内用アカウントの割引セールを行っていることもあります。Scalaのインストール方法の記事も合わせてご覧ください。Scalaは非常にメリットの大きい素晴らしい言語です。どの言語でも使いこなせるなら、Scalaを選択する人も多いでしょう。Scalaを選択できない大きな理由として、学習コストが高いことがあります。学習コストが高いというのは、習得するまでに時間がかかるということを意味します。具体的に何が難しいかというと、オブジェクト指向言語と関数型言語の両方を十分理解した上で使うことで、はじめてScalaの素晴らしさをプログラムとして反映できる点にあります。学習コストが高いというデメリットは有るものの、デメリットが学習コストしか無いという考え方もできる素晴らしい言語だと言えるでしょう。今回は、Scalaとはどんな言語なのか、どんなメリット・デメリットがあるのか解説しました。Scalaを学び始めようと考えている人は、ぜひ参考にしてみてください。IDEAでScalaのプラグインをインストールすることで、開発環境を構築することができるんだ。Scalaは難しいけれど、それだけできることも多い言語って感じでしょうか。関数型プログラミングについてはまた別のところで解説するよ。Scalaを勉強する上でも大事な要素になるのでぜひ覚えておこう。現役エンジニアから学べる無料のプログラミング体験会もオンラインで実施しているので、ぜひ参加してみてください。オンラインのプログラミングスクールTechAcademyでは、Scalaオンライン講座を開催しています。Scalaを使ってWebアプリケーションを開発することができます。現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。利用したシステム開発、店舗検索スマホアプリ開発など。その他にも地域の職業プログラマー育成活動を行い、2018年には小学生がUnityで開発したオリジナルAndroidアプリをGooglePlayでリリース。ゲームで遊ぶより作ろうぜ!を合言葉に、小学生でも起業できる技術力を育成可能で有ることを証明し続けている。Scala高階関数の使い方!Pythonでreduceを使う方法【初心者向け】Pythonでreduceを使う方法について解説します。Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事をまずご覧ください。本記事は、TechAcademyのPythonオンライン講座の内容をもとにしています。関数型言語に慣れている方は、iterableに対して関数を適用したいと思うことがあるかと思います。関数型言語をよく知らない方はfor文などを使用してiterableを処理されるかもしれません。今回は、関数型言語でよく使用されるreduce(畳み込み)を見ていきましょう。iterableの要素に対して左から右に累積的に関数を適用し、iterableを単一の値にしてみましょう。