2017-08-20 17 views
6

RAMDA連鎖使用

var duplicate = n => [n, n]; 
R.chain(duplicate, [1, 2, 3]); //=> [1, 1, 2, 2, 3, 3] 
R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1] 

最初の例は非常に単純であり、それはアレイ内のすべての要素に()を重複適用し、結果を連結します。しかし、私は2番目の例を理解するのに苦労しています。 R.append + R.headを配列とどのくらい正確にマッピングしていますか?誰かが2番目の例の説明をステップバイステップで提供できますか?

私は構成とカレーに精通しています。

おかげ

答えて

9

第二の例はR.chainは、関数(又はファンタジーランドchain仕様を実装するもの)のような配列以外のものを使用することができる方法を示しています。

配列をマッピングして連結するという概念が慣れている場合、別の関数の関数を単純な関数の構成としてマッピングすると考えることができます。連結部にはさらに説明が必要です。

R.chainのようにその署名を宣言します。

アレイの場合
Chain m => (a → m b) → m a → m b 

、我々が得るために[]mを入れ替えることができますいくつかの引数rを受け取る関数については

(a → [b]) → [a] → [b] 

を、それは次のようになります。

(a → r → b) → (r → a) → (r → b) 

だから、可能なこれらのタイプの知識だけで、最終的r → b機能を生成する唯一の方法は、次の操作を実行することです:

  • a
  • の両方を適用生成するために第二の機能に受け取った引数を渡すr

    b

またはコードをもたらすを生成する第一の機能に新しいa、元r例から関数で入れ替える

// specialised to functions 
const chain = (firstFn, secondFn) => 
    x => firstFn(secondFn(x), x) 

、あなたはそれがなると見ることができます:

x => R.append(R.head(x), x) 

あなたはR.convergeに精通している場合、これは事実である:

R.converge(firstFn, [secondFn, R.identity]) 
+1

説明をいただきありがとうございます。今、私にはもっと意味があります。 – user941749

+1

ベストの説明私はまだこれを見てきました! – Jolleyboy

+0

正直言って私はまだそれを取得していません。 R.chain関数が配列のために一つのことを行い、関数のためにもう一つのことをしますか?それらは2つの機能が1つに統合されていますか?形成することができる:((X)、X secondFn) は、アレイ場合の意味をなすために CONST鎖=(firstFn、secondFn)=> X => firstFnにすること?その場合、関数はsecondFnになりますか? –

-1

希望これは

を支援
let R = require('ramda') 

// using vanillajs 
let append = (arr1) => (arr2) => arr2.concat(arr1) 
let double = (arr1) => arr1.map(x => 2*x) 

let chain = (f, g) => arr => { 
    let yarr = g(arr) 
    return f(yarr)(arr) 
} 

console.log(chain(
    append, 
    double 
)([10, 15, 20])) 

//using Ramda 
console.log(R.chain(append, double)([10, 15, 20]))