JavaScriptでのカリー化

すべてのプログラマが遵守しようとしている原則の一つはドライです(自分自身を繰り返すことはありません)、カリー化では、私たちの関数でこれを行う方法は非常に簡単で便利です。

このコンテンツは、私のニュースレターで最初に公開し、私のブログで公開ニュースレターを公開した週の後、あなたが購読を読むために最初になりたい場

バナー投稿

私たちは通常、私たちの関数を書く方法は次のとおりです:

//ES2015const divisible = (num, mod) => num % mod;//ES5var divisible = function(num, mod) { return num % mod;}

この関数を実行するには2つの引数を渡す必要がありますが、数値が偶数であるかどうかを排他的にチェックする関数が必要な場合は、新しい関数 この時点で、currified関数を持つと便利です。

currified関数がどのように機能するかを理解する前に、いくつかの概念を知っている必要があります。

関数はファーストクラスの市民であり、これは関数がオブジェクトであることを意味し、引数として渡し、変数に格納し、他の関数内で返すことができますJavaScriptの高次の関数

クロージャは、関数が字句スコープの外で実行された場合でも、関数が覚えて字句スコープにアクセスできるときです。 JavaScriptのクロージャについて

関数が複数のパラメータを受け取った場合、関数はパラメータを受け取り、関数を返し、次にパラメータを受け取り、結果を返すように書き換えることができます。 JavaScriptでlambdaを計算します

¿カレーとは何ですか?

Curryは、予想よりも少ないパラメータで関数を呼び出すことができ、残りのパラメータを待機して結果を返す関数を返します。

このようにして、関数を次のように最初に書き換えることができます

//ES2015const divisible = mod => num => num % mod;//ES5var divisible = function (mod) { return function (num) { return num % mod; }}

この関数を呼び出すには、2つのオプションがあります

  • 関数を実行して引数を渡します
divisible(10)(2)
  • 引数を渡し、この引数を覚えている関数を受け取る
const divisibleEn3 = divisible(3);divisibleEn3(10)

関数を記述すると、currificadaは複雑ではありませんが、escribimoscualquier関数としてもう少し自然に行うことができます。

このために、lodashまたはramdaを使用することができますcurryメソッドを使用すると、このように任意の関数をcurrifyできます。

import { __, curry, map } from 'ramda';const composeNombre = curry( (primer, apellido) => `${primer} ${apellido}`);const familiaJaimes = composeNombre(__, 'Jaimes')const nombres = console.log(map(familiaJaimes, nombres))

関数型プログラミングへの主に適切なガイドから取られたより有用な例を見てみましょう

import { curry } from 'ramda';// Estas funciones las puedes conseguir dentro de Ramda o Lodashvar match = curry(function(what, str) { return str.match(what);});var replace = curry(function(what, replacement, str) { return str.replace(what, replacement);});var filter = curry(function(f, ary) { return ary.filter(f);});var map = curry(function(f, ary) { return ary.map(f);});var hasSpaces = match(/\s+/g);hasSpaces("hello world");// hasSpaces("spaceless");// nullfilter(hasSpaces, );// var findSpaces = filter(hasSpaces);// function(xs) { return xs.filter(function(x) { return x.match(/\s+/g) }) }findSpaces();// 

カリー化の利点

  • いくつかのパラメータを持つ基底関数を渡すだけで、新しい関数を作成できます。
  • 単一の要素で動作する関数を、マップでラップすることによってリストで動作する関数に変換することができます。
  • 再利用しやすい小さなコードを書くことができます。
  • それらについて推論するのは簡単です。
  • currified関数を記述すると、関数を構成することができます。



+