Scal関数式プログラミングのテーマ


なぜ関数式プログラミングを学ぶ必要がありますか?あるいは関数式プログラミングにはどんなメリットがありますか?このシリーズの中で、私はscalaを使って関数式プログラミングの利点と関数式哲学を説明します。scalaが分からなくても大丈夫です。scalaとjavaは似ています。各編の冒頭で私も先にこのセクションで使うscala文法を説明します。
どうして関数式のプログラミングはここ数年火が出ますか?
Pythonのように、関数式プログラミング(FP、Functional Programming)も近年になってようやく人々に知られるようになりましたが、そんなに新しい概念ではありません。オブジェクト指向プログラミング(OOP)とほぼ等長の歴史を持っています。しかしすべての事の脈絡を見渡して、いつも原因があって、関数式のプログラミングのこの数年の怒る原因は何ですか?
最も主要な原因はムーア法則の漸次的な故障であり、コンピュータの発展の道は多核CPUと分散の方向に向かっている。私たちがよく使用するオブジェクト指向プログラミングの利点は、解決すべき問題分野をモデル化することができることであるが、マルチスレッドプログラミング環境での同期ブロッキングコール、およびこれによるスレッドセキュリティ問題は、関数式プログラミングが自然に分散型同時プログラミングに適したプログラミング方式と比較して、見劣りがする。未来は明らかに大きいデータの時代です。だから、関数式プログラミングはますます重要になります。将来は関数式プログラミングの時代かもしれません。
ムーアの法則:1965年、インテルの創始者ゴードン・ムーアは、最大10年以内に、集積回路の集積度が2年ごとに倍増する、すなわちムーアの法則を提唱した。その後、このサイクルは18ヶ月に短縮されました。つまり、18ヶ月ごとにコンピュータなどのIT製品の性能が倍増します。あるいは同じ性能のコンピュータなどのIT製品は18ヶ月ごとに価格が半分下がります。数十年来のIT業界の発展は常にムーア法則の予測速度に従っています。
関数式プログラミング思想紹介
面白い文章があります。関数式プログラミングについて知っているかもしれません。まずそれを見て、後で関数式の正式な定義を見てください。
関数プログラミングとは、実際には純粋な関数でコードを作成します。純粋な関数の定義は以下の通りです。
純粋な関数:1つの関数は、プログラムの実行中に、入力パラメータに基づいて演算結果を与える以外には、副作用がないということができます。このような関数を純粋な関数と呼ぶことができます。
純関数の最も核心的な目的は副作用のないコードを作成するためであり、その多くの特性は変数なし、不活性値などを含む。副作用がないとは何ですか?私たちは一例を使ってみます。
喫茶店の買い物の例--scala
まず、副作用(関数ではない)のあるコードを見てください。

class Cafe {
 //             
 def buyCoffee(Cc: CreditCard) : Coffee = {
 val cup = new Coffee()
 //     ,        ,            
 cc.charge(cup.price)
 cup
 }
}
この関数の副作用は何ですか?コーヒーを一杯買った時、クレジットカードで計算します。カード会社に一連の処理を行うように通知します。
これはどんな問題を引き起こしますか?まず、副作用はこのコードをスレッドにするのが安全ではありません。その次に、このコードをテストしにくくなります。このコードのロジックをテストしたいなら、毎回クレジットカードにチャージさせなければなりません。でも、論理をテストしたいだけです。本当にお金を掛けたくないです。また、コーヒーを一度に何杯も買いたい時はどうすればいいですか?

この時、関数式の方式を見て、実現します。
関数的な喫茶店

case class Charge(cc: CreditCard,amount: Double)
class Cafe{
 def buyCoffee(cc:CreditCard) : (Coffee,Charge) = {
 val cup = new Coffee()
 (cup,Charge(cc,cup.price))
 }
}
見ましたか?私達がこのように変化した後、関数は副作用がなくなりました。つまり、このbuyCoffee関数を何回実行しても、1杯のコーヒーとその値段だけを返してくれます。そうすると、私たちは便利にそのロジックをテストして、クレジットカードに影響する心配がないです。そして、マルチスレッド環境で安全に動作することができます。
実は対象に向けての角度から見ると、これはちょっと対象に向けたデザインのようですか?このようにしてコーヒーとクレジットカードの関係を解消しました。他の機能を追加する時に便利に組み合わせられます。例えば、コーヒーの数杯分の料金を計算する機能がほしいです。上記のコードで需要を実現すれば、きっとつらいです。関数式で改編したら、いくつかは明らかになります。
この角度から言えば、関数式プログラミングも実は一種のプログラミング思惟であってもいいです。すぐにより良い職位を獲得するのに役立ちません。しかし、ある程度からプログラミングの思考を変えて、より優秀なコードを書かせます。
おわりに
ここ数年、多くの新しい火が起きる概念ですが、それらは実は前世紀にすでに発明されました。タイムマシン学習、深さ学習、Python言語、または関数式プログラミングです。これはなぜですか?これらの技術の境界が変化したからです。あるいはこの時代の技術境界が変わったからです。
時代ごとに技術の境界があります。本当の技師は境界がどこにあるかを知ることができます。バフェットは彼が自分の分からないものに投資しないと言っています。彼が自分の境界を決めたからです。
アップルが成功できる重要な理由は、時代の境界をよく知っていて、境界内でベストを尽くすことができるからです。アップルの多くの製品は画期的な意味を持っていますよね。でも、その製品はアップルが初めて作ったものではないです。例えば、スマートフォンは、最初は日本のドコモが発明したものです。タブレットはイギリスが初めて発明したものです。IPod、MP 3も韓国が先に作ったものです。アップル社が使っている多くの技術は30年前にもありましたが、なぜ発明されるまで人々に知られていますか?
アップルが時代の技術の境界を理解し、境界内でベストを尽くしているからです。
小さい方に言ってください。新しい技術を勉強したり、新しい技術を使って仕事を完成したりする時、私達は必ずその境界がどこにありますか?大になったら、私たちはリンゴのように、この時代の技術境界はどこにあるかを考えてみてください。これで、無限の技術追跡に陥ることはありません。