javascript柯里化

4921 ワード

Currying is not idiomatic in JavaScript
1.「あまり使わない」とはどういう意味ですか?
ちょっと急進的なタイトルは、タイトル党がこのブログを誤読する可能性があります.私は明らかにしたいです.私は関数式のプログラミングが好きです.私の主な観点は:
  • コアJavaScript機能の一部は、curryingと競合している.
  • はcurryingには他の選択肢があると思います.特に来るべき提案があります.partial appication(偏関数アプリケーション)で使うのはとてもいいです.これはあまり衝突がありません.
  • JavaScriptの最も良い特性の一つは、様々なプログラミングスタイルを適用できることです.そのため:Curryingは何も言及していない代替品までプログラミングすれば、Currringを思う存分適用してもいいです.このようにすればコードのスタイルが一致するようにしてください.そして、あなたのコードを準備します.生態系の他の部分とはちょっと違います.
    2.Currying
    Curryingは関数式プログラミングにおいて人気のある技術であり、偏関数の応用に役立つ.
    この考え方は、関数にすべてのパラメータを提供しないと、関数を返します.関数のパラメータは残りのパラメータで、その出力は元の関数の結果です.
    例えば、配列のすべての要素に2を加えたい場合、バイナリ関数Add(x,y)があります.
    const arr = [1, 2, 3];
    
    arr.map(add(2)); // [3, 4, 5]`
    ちなみに、自動curryingを有する関数式プログラミング言語は、通常、このように使用可能な加算オペレータを有する.
    二つの選択があります.addを実行する方法があります.curryingをサポートします.
    2.1シンプルcurrying
    ES 6矢印関数は、簡単に手動でコリ関数を作成することができる.
    const add = x => y => x + y;
    
    //    (   )
    function add(x) { 
        return function(y) {
            return x + y;
        }
    }
    以下のようにadd()を実行できます.
    add(2)(3); // 5
    一つの関数は複数の変換が必要な入れ子関数を持っています.自動curryingを持つ関数式プログラミング言語の多くは文法的にadd(1,2)とadd(1)(2)の区別がありません.
    2.2 curryingをリロードする
    いくつかのライブラリは、リロードの関数を提供します.これらの積載関数はパラメータの数によってそれぞれ異なる表現があります.
  • 一つのパラメータだけを使用するとコリック化されます.
  • は、すべてのパラメータを使用すると、通常の関数として呼び出されます.
  • は、複数のパラメータ(全てのパラメータではなく)を使用すると、これらのパラメータに結合された関数を返します.
  • この形式のcurringの実現は以下の通りである.
      function add(...args) {
          if (args.length < 2) {
              return add.bind(this, ...args);
          }
          const [x, y] = args;
          return x + y;
      }
    ツール関数を作成して、普通の関数をこのような実現に変換できます.
    2.3まとめ
    コリック化は偏向関数の応用に役立つ関数変換技術である.
    3.Curryingといくつかのjavascriptの基礎は衝突があります.
    JavaScriptでcurryingを使ってプログラムしたいなら、二つの選択があります.
  • 本物のcurryingを使用します.
  • は、静的に入力しやすいと提唱しています.
  • 反対:一般的ではない関数が文法を呼び出す.
  • リロードcurryingを使用する.
  • 提唱:優雅な文法.
  • は反対します.取得しにくい静的タイプです.
  • 内蔵関数や方法を変えてあなたのcurryingスタイルに適応すれば、多くの問題に直面します.
    これらの欠点はすべて同じように重要ではありません.
    3.1名前パラメータ
    javascriptの中の有名なパラメータはObjectの字面量シミュレーション(Simullating named parameters ES 6)を通じて私はこのような結合パラメータの方式が好きで、彼はコードをより自己記述性があるようにします.すべてのcurryingではないjavascriptライブラリは、名前パラメータをサポートします.
    3.2関数の呼び出しと非関数の呼び出しが不明です.
    通常は関数の後に()を使って関数を実行することができます.Currrying後、関数fooの関数の個数を明確に知る必要があります.foo(123)が実行された後に得られたのは関数ですか?それとも関数ですか?
    下の二つの偏関数を比較して適用します.
      foo(123, ?)
      _ => foo(123, _)
    foo()は様々な方法での呼び出しに対応しています.
    名前パラメータを使うと、curryではより多くの情報が失われます.
      arr.map(findCity({ latitude: ‎48.137154 })); // curried
      arr.map(_ => findCity({ latitude: ‎48.137154, longitude: _ }))
    静的タイプシステム(Type Script,Flow,…)はエラーを低減しますが、代替方法はまだ読みやすいです.
    3.3 Curryingとデフォルトパラメータの衝突
    パラメータを無視すると、関数のデフォルトパラメータが使用されます.
      function add(x=0, y=0) {
          return x + y;
      }
    デフォルトパラメータは、追加パラメータをより透明にし、既存の呼び出しを破壊しないようにすることができます.この技術はネーミングパラメータに特に有用で、汎用関数と方法の適用性を保証するためによく使われます.
    パラメータのデフォルト値を使用してパラメータを省略するということは、デフォルト値を使用して、curryingを使用してパラメータを省略するということは、偏り関数を返すことを意味するので、両者が衝突します.
    3.4 Currying友好の関数
    Curryingを用いて,パラメータは関数開始に対して構成と演算の終了に重要である.Javascriptの中ではそうではないです.
    例えば、パースInt()の署名は、
      parseInt(s : string, radix : number);
    これにより、ベースをこのように事前に充填することは不可能になる.
      ['32', '17', '5'].map(parseInt(10)) // doesn’t work
    偏関数プログラミングにはどのような代替案がありますか?
    Curryingというと、一般的には偏関数プログラミングがほしいです.次の例を見てみましょう.Curryingを再ロードし、代替案を探索します.
      [1, 2, 3].map(add(2))
    代替1:.bind()
      [1, 2, 3].map(add.bind(null, 2))
    代替2:arrow functions.
      [1, 2, 3].map(x => add(2, x))
    代替3:an uploming proposal for partial aplication.
      [1, 2, 3].map(add(2, ?))
    文法が固定されていて、提案は早い段階にあります.
    この提案の利点は、任意の署名をうまく処理し、記述的な文法を備えていることにある.
    5.拡張読み
  • Currying versus partial appration(with JavaScript code)
  • Arrow functions vs.bind()
  • アンキュリー「this」in JavaScript
  • 原文の住所
  • 私のブログ:neverland.githb.io
  • 私のemail [email protected]