2017-08-20 2 views
6

Vom documentation:Ramda Kette Nutzung

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] 

Das erste Beispiel ist sehr einfach, gilt es zu duplizieren(), um jedes Element in dem Array und verkettet das Ergebnis. Aber ich habe Probleme, das zweite Beispiel zu verstehen. Wie genau mappt es R.append + R.head über das Array? Kann jemand bitte eine Schritt für Schritt Erklärung für das zweite Beispiel geben?

Ich bin vertraut mit komponieren und currying.

Dank

Antwort

9

Das zweite Beispiel zeigt, wie R.chain andere Dinge als Arrays verwendet werden kann, wie zum Beispiel Funktionen (oder irgendetwas des Fantasie-Land chain spec Implementierung).

Wenn Ihnen das Konzept des Mappings und der anschließenden Verkettung eines Arrays vertraut ist, können Sie sich eine Funktion als einfache Funktionszuordnung einer anderen Funktion zuordnen. Der Verkettungsteil erfordert eine weitere Erläuterung.

R.chain erklärt seine Unterschrift als:

Chain m => (a → m b) → m a → m b 

Für Arrays können wir die m mit [] tauschen zu bekommen: Funktionen

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

Für die etwas Argument erhalten r, wird es:

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

So nur mit dem Wissen dieser Typen zur Verfügung, die einzige Möglichkeit, die endgültige r → b Funktion zu erzeugen, ist folgendes zu tun:

  • Übergeben Sie das empfangene Argument r auf die zweite Funktion eine a
  • beide zu produzieren Nehmen die neuen a und die ursprünglichen r auf die erste Funktion der resultierenden b

Oder in Code zu erzeugen:

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

in den Funktionen aus dem Beispiel Swapping, können Sie es wird sehen:

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

Wenn Sie mit R.converge vertraut sind, dann ist dies effektiv:

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

Vielen Dank für die Erklärung, es macht jetzt viel mehr Sinn für mich. – user941749

+1

Beste Erklärung, die ich bisher gesehen habe! – Jolleyboy

+0

Um ehrlich zu sein, verstehe ich es immer noch nicht. Ist es, dass die R.chain-Funktion eine Sache für Arrays und eine andere Sache für Funktionen tut? Sind sie zwei Funktionen, die zu einer zusammengeführt werden?Kann die Form: const Kette = (firstFn, secondFn) => x => firstFn (secondFn (x), x) auch gemacht werden, Sinn für den Array Fall zu machen? In diesem Fall, welche Funktion wäre secondFn? –

-1

this helps

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]))