Ramda chain usage

后端 未结 4 519
深忆病人
深忆病人 2020-12-16 02:19

From the documentation:

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]); //=&g         


        
4条回答
  •  粉色の甜心
    2020-12-16 02:51

    The second example is showing how R.chain can be used things other than arrays, such as functions (or anything implementing the Fantasy Land chain spec).

    If the concept of mapping and then concatenating an array is familiar to you, you can think of mapping a function over another function as plain function composition. The concatenating part will require further explanation.

    R.chain declares its signature as:

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

    For arrays, we can swap the m with [] to get:

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

    For functions that receive some argument r, it becomes:

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

    So with only the knowledge of those types available, the only way to produce the final r → b function is to do the following:

    • Pass the received argument r to the second function to produce an a
    • Apply both the new a and the original r to the first function to produce the resulting b

    Or in code:

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

    Swapping in the functions from the example, you can see it becomes:

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

    If you are familiar with R.converge then this is effectively:

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

提交回复
热议问题