Articles

A beginner friendly intro to functional programming

Johann Schuster
Oct 25, 2017 · 7 min read

Photo by Sebastien Gabriel on Unsplash

Functional programming is a highly valued approach to writing code, and it’s popularity is continuously increasing in 商用ソフトウェアアプリケーション。 関数型プログラミングは、コードを書くパラダイムであり、このWikipediaの記事の紹介に雄弁に置かれています:

“-コンピュータプログラムの構造と要素を構築す これは宣言型プログラミングパラダイムであり、プログラミングは文の代わりに式または宣言で行われることを意味します。”

私たちはすぐにこれが正確に何を意味するのかを理解しますが、まず、いくつかの文脈を提供することによって、基礎を邪魔にしましょう。 この記事では、関数型プログラミングの基本的な概念を紹介し、その終わりまでに、なぜそれをコーディングスタイルに適用するのか、JavaScriptとどのように関 この記事の上に構築し、ここで議論されているアイデアをさらに深く掘り下げる第二の記事に目を光らせてください。

関数型プログラミングのルーツは、我々は非常にすぐに表示されますものと同様の関数を使用して計算を表現するために1930年代に開発されたシステ かなり長い間、関数型プログラミングの概念と言語は学界や学術的な文脈で広く議論され、最終的には商用ソフトウェアの開発に費やされました。 プログラミング言語を機能的にするかどうかは、関数型プログラミングパラダイムを容易にする能力であり、これらのような言語はRuby、Python、Julia、JavaScriptであり、後者は命令型、オブジェクト指向、関数型パラダイムの性質を持っている。

命令型を使用した例を見て、次に単一のタスクを完了するための機能的なアプローチを見てみましょう。

命令型:

const arr = function getOdds(arr){
let odds = ; for(let i = 0; i < arr.length + 1; i++){
if ( i % 2 !== 0 ){
odds.push( i )
};
};
return odds
};console.log(getOdds(arr))
// logs

関数型:

関数型:

関数型:

関数型:

:

function getOdds2(arr){
return arr.filter(num => num % 2 !== 0)
}console.log(getOdds2(arr))
// logs // this can be even shorter
const getOdds3 = arr => arr.filter(num => num % 2 !== 0)console.log(getOdds3(arr))
// logs

機能的なアプローチが明らかな改善を除いて、短いコードのように、私たちにキーストロークのカップルを保存し、それが一目で理解する方がはるかに簡単であるという事実、それはまた、クリーンなコードになり、デバッグ、テスト、メンテナンスを簡素化し、エレガントです。

これを少し分解して、二つのアプローチの違いを明確に理解し、関数型プログラミングとは何かを定義できるようにしましょう。

最初のアプローチでは、配列から奇数をフィルタリングするタスクを達成するために必要なすべてのイベントを強制的に記述しています。 私たちは関数に配列を与え、関数の中に奇数を格納するために使用する空の配列を作成します。 配列をループするように指示し、現在のインデックスが奇数の場合は条件を宣言し、空のインデックスにプッシュします。 Forループには配列の最後の数値は含まれず、それに至るまでの数値のみが含まれているため、最後の数値が奇数の場合は含まれません。 したがって、ループが行う必要がある反復の量を定義するときに+1を追加します。

第二のアプローチでは、filterと呼ばれるメソッドを使用して見たい結果を定義し、その間のすべてのステップをマシンが処理できるようにします。 これはより宣言的なアプローチです。 私たちは最終的な結果が何でなければならないかを宣言し、残りは私たちのために処理されます。これで、上記の定義が何を表現しようとしているのかがわかります。

ステートメントではなく、宣言と式を使用してプログラミングする方法。 この定義は関数型プログラミングの表面を掻き集めるだけであり、私たちの理解が成長するにつれて、私たちは継続的に定義を構築します。

反復的アプローチと機能的アプローチのいくつかの違い。文体的には、段階的に説明するのではなく、問題と見たい変更を定義します。

  • 空の配列の状態を管理する上記のような関数で状態を管理する必要はありません。
  • 私たちは、実行の順序についてそれほど心配する必要はありません。
  • 私たちは、より少ないループ、条件を使用し、より多くの組み込みメソッド、再利用可能な関数と再帰を使用します。
  • このアプローチを使用することにより、最終的には上記のように、デバッグとメンテナンスに役立つクリーンなコードを作成します。 それは物事をモジュール化し続け、コードのセクションは簡単にテストできる小さな部分に分割されています。 ヘルパー関数を使用してコードの一部を再利用することができ、最後に、コードを書くためのより効率的で数学的なアプローチです。ピラー

    ピラー

    ピラー: 機能コードを書くための私たちのコーディングツールキット

    以下は、高品質の機能コードを書くためのいくつかの重要な側面です。 これが概要であることを見て、私たちはそれぞれにあまり飛び込むことはありません、代わりに我々はちょうどいくつかの重要な特性とそれぞれの一例を定義します。P>

    純粋な関数:

    純粋な関数は、渡されたものに基づいて値を返します。 その背後にある考え方は、同じ値が渡された場合に常に同じ結果を返す場合、純粋な関数になり、tsスコープ外の値を変更しないため、システム内のどの したがって、純粋な関数はデータを変更することができず、副作用を生じさせず、容易に再利用することができます。 純粋でない関数の例は、API呼び出しを行うか、予測できない結果を返す関数です。

    単純な不純な関数:

    var tip = 0;function calculateTip( mealTotal ) {
    tip = 0.15 * mealTotal;
    }calculateTip( 150 )
    console.log(tip)

    単純な純粋な関数:p>

    function isPure(x,y) {
    return x * y
    }console.log(isPure(3,5));

    純粋な関数は毎回正確な結果を返し、その外部のデータを変更しません。 注意すべき重要なことは、純粋な関数はデータの変化から遠ざかる必要があるため、純粋な関数内で使用するメソッドを選択するときは注意してくださ たとえば、通常React reducerで行うように、関数内で2つの配列をマージしたい場合は、配列の使用を避けてください。プロトタイプ。push()メソッド。 代わりに、配列を使用したいと思います。プロトタイプ。concat()は、古い配列の状態を保持し、使用するために新しい配列を返します。Javascriptでは、関数はオブジェクトとして扱われるため、他の値と同じように関数を渡すことができます。 高次関数は、単に他の関数で動作する関数です。 関数を入力として取り込むことも、関数を出力として返すこともできます。 次のデモでは、簡単な例を見ていきます。

    匿名関数:

    匿名関数は、必要に応じてアドホックロジックを定義する必要があるときに非常に役立ちます。 名前が示すように、無名の無名関数であり、主に名前付き関数、変数に代入された関数、または高次関数の関数として返される関数の代わりとして関数への引数として検出されます。 そのルーツはラムダ計算に大きくあり、すべての関数型プログラミング言語にとって非常に重要です。

    変数に割り当てられた無名関数。 必要なときに簡単に渡して呼び出すことができます。

    const myVar = function(){console.log(‘Anonymous function here!’)}myVar()

    引数としての無名関数

    setInterval(function(){console.log(new Date().getTime())}, 1000);

    高次関数内の無名関数

    function mealCall(meal){
    return function(message){
    return console.log(message + " " + meal + ‘!!’)
    }
    }const announceDinner = mealCall(‘dinner’)
    const announceLunch = mealCall(‘breakfast’)announceDinner(‘hey!, come and get your’)
    announceLunch(‘Rise and shine! time for’)

    再帰

    再帰はよく知られている関数型プログ 再帰関数は単に自分自身を呼び出す関数であるため、同じコードを複数回実行するループとして機能します。 しかし、無限再帰を避けるために注意する必要があります。 したがって、いつ停止するかを伝えるためには、基本ケースが必要です。 再帰関数またはアルゴリズムは、再帰とループの両方を使用して実装できますが、再帰を使用する方が良いでしょう。 以下は、再帰とループの両方を使用して数値を因数分解するためのよく知られたアルゴリズムです。

    再帰関数

    function factorialize(num){
    if (num === 0 || num === 1){return 1;}
    return (num * factorialize(num — 1));
    }var result = factorialize(14);console.log(result);

    ループを使用した再帰

    function factorialize(num) {
    if (num === 0 || num === 1){
    return 1;
    }
    for (var i = num-1; i >= 1; i-- ) {
    num *= i;
    }
    return num;
    }
    console.log(factorialize(6));

    関数コードを書くために不可欠な要素のいくつかをカバーしました。 アプリケーションで常に機能コードを記述することはできませんが、可能な限り使用すると利点が大きくなります。 AngularやReactのようなフレームワークは関数型プログラミングの影響を強く受けており、ReduxやLodashのようなライブラリはその利点を利用できるので、FPの方法で

    より多くの学習のためのリソース? ここにそれ以上の学習のためのある大きい記事そして資源はある。

    • なぜJavaScriptで関数型プログラミングを学ぶのですか? あなたはCharles Scalfaniによって機能的なプログラマになりたいです

    写真patrick Fore on unsplash

    私は本当にこれが参考になったことを願っており、次の記事では、javascriptメソッド、部分アプリケーション、カリー化、引数バインディングなど、さらに面白くて便利なツールを少し深く掘り下げて解凍します。拍手、共有、批判やトピック上の任意の考えを共有すること自由に感じます!

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です