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]); //=> [1, 2, 3, 1]
The first example is very straight forward, it applies duplicate() to every element in the array and concatenates the result. But I am having trouble understanding the second example. How exactly is it mapping R.append + R.head over the array? Can someone please provide a step by step explanation for the second example ?
I am familiar with compose and currying.
Thanks
Ramda is a practical functional library for JavaScript programmers. The library focuses on immutability and side-effect free functions. Ramda functions are also automatically curried, which allows to build up new functions from old ones simply by not supplying the final parameters.
Ramda is generally a better approach for functional programming as it was designed for this and has a community established in this sense. Lodash is generally better otherwise when needing specific functions (esp. debounce ).
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:
r
to the second function to produce an a
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])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With