閉鎖、通貨などで混乱しないでください


あなたが方法と詳細について心配しているならば、ちょっとリラックスしてください.論理演算にフォーカスします.
機能的なスタイルの基本的な問題は、データ変換の論理を扱うことです.あなたはどのように動作するかを知る必要はありませんRamda ). 技術的な特徴を説明しようとして、部分的なアプリケーションを実装している機能の例を与えてください.
あなたがforループの詳細な構造のように、どのように重要であるか、より命令的なスタイルに慣れているならば、それは閉鎖、詳細、部分的なアプリケーションなどの詳細に対処することを混乱させることができます.これらのことがどのように動作するかを詳細に伝える多くのリソースがあります.しかし、機能プログラミングは論理とデータ操作についてです.あなたは詳細について心配する必要はありませんので、しないでください!これらのツールができることを理解することは重要です.

擬似コードを書き、マッチする関数を再利用または書き込みます。


私が本当に「私が得た」ことを最初に感じたのは、Curryingの概念がゼロからカレーまたは部分的なアプリケーション機能を構築する方法を説明している例を読んでいなかったということでした.それは単純な問題を解決するための概念を使用していた.さて、次のような問題や解決策は良いことではありません.
擬似コードの簡単な例
  • アプリを使用できるように基本的なボタンを作成します
  • 後でそれを更新する方法を保存
  • 基本ボタンを描画する

  • ユーザーからの情報を取得している間、ここで遅れてください
  • 最終的にボタンを更新する情報を得る
  • 更新を行うには保存されたメソッドを使用します
  • 必要に応じて、同じ機能が異なるデータで、再びこれを行う
  • ここで重要な機能は、いくつかのデータを取得し、変更を行うに適用することができるの遅れです.ボーナスは再びこれを繰り返すことができます.遅延がある場合は、後で使用するための機能やデータを保持するために、(または、閉じる)を使用します.
    import { curry } from 'ramda'
    
    /**
     * return { HTMLButtonElement }
     */
    const updateButton = curry((/** @type { HTMLButtonElement } */ button, /** @type { string } */ label) => {
        return button.textContent = label
    })
    /** @type { HTMLButtonElement } */
    const buttonToUpdate = document.getElementsById('button')
    renderBasicButton(/** @type { HTMLButtonElement } */ buttonToUpdate, 'dummy label') // create the button with an initial label
    // generate a new function
    renderButtonWithLateLabel = updateButton(/** @type { HTMLButtonElement } */ buttonToUpdate) // use currying to store the ability to update the button later
    // renderButtonWithLateLabel is now a function that has stored the button. It's just waiting for the second argument, the string, to come along later.
    
    // do stuff, get a string from the user maybe
    
    /** @type { string } */
    const labelDefinedLater = "text"
    renderButtonWithLateLabel(/** @type { string } */ labelDefinedLater)
    // now we complete the logical step by updating the "saved" button with a new label
    
    だからおもちゃの例が、それはすべての私は通貨の原理を把握するために必要だった.それはすべての遅延機能についてです.
    別のより便利な例は、配列内のオブジェクト内の値を管理しています.私は特定のオブジェクト(例えば、' key 'の指定値で)の値' good 'を更新したいと言います.これはquite a complex process 変異されたデータのうち、入れ子になったループは、それぞれのオブジェクトを検索し、変更して配列を再構築します.
    しかし、私は“オブジェクト配列Ramdaで更新値”の後にあった一般的な論理をミラーリングするフレーズでGoogle検索を行ったfirst result 私の欲しいものです.
    import { curry, map, when, propEq, assoc } from 'ramda'
    
    const alter = curry((checked, key, items) => map(
      when(propEq('key', key), assoc('good', checked)),
      items
    ))
    
    const arrayWithUpdatedObject = alter('true', '22', items)
    // in the array "items", find the object with 'key' is 22 and set 'good' to be true
    
    どちらが良いかは、どちらかというと一種のショットです.私が最初の議論をするならばpropEq Curry関数への引数は、より面白くなります.追加の引数を作成することにより、後で使用する機能の側面を保存することができます.
    const alter = curry((alterBy, checked, key, items) => map(
      when(propEq(alterBy, key), assoc('good', checked)),
      items
    ))
    
    const alterByKey = alter('key') // save the concept of matching the objects by key
    
    const arrayWithUpdatedObject = alterByKey('true', '22', items) // will alter the object with key === '22'
    
    // alternatively you could create a separate instance which identifies objects to alter by id
    const alterById = alter('id')
    
    多くの点で、閉鎖は通貨に似ています.あなたは後で使用するいくつかのデータや機能を維持している.閉じるこの動画はお気に入りから削除されています.
    ここでは、後でデータと機能を格納するクロージャを使用します.関数が呼び出されるperson これには(firstName , lastName ) と関数getFullName , setFullName ) これは後で使用するために保存されます.
    ありがとう
    .ltag__user__id__296048 .アクションボタン
    背景色:1 .重要
    カラー:竜華ffffff!重要
    ボーダーカラー:2 .重要


    ストップ


    stopachka