[Ramda] Compose and Curry
Posted Answer1215
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Ramda] Compose and Curry相关的知识,希望对你有一定的参考价值。
Curry:
The idea of Curry is to spreate the data from the function. Using Curry to define the function logic and later pass the data into the function logic.
Example1:
const get = R.curry(function(prop, obj){ return obj[prop]; }); const obj1 = { foo: ‘bar‘ } console.log(get(‘foo‘)); //function (t){return n.apply(this,arguments)} console.log(get(‘foo‘)(obj1)); //bar
The function ‘get‘ just care about get the value from the object, doesn‘t care about what data it deal with. Make it more reuseable.
Example 2:
const ary1 = [ { name: ‘foo‘ }, { name: ‘bar‘ } ]; const names = R.map(get(‘name‘)); console.log(names(ary1)); //["foo", "bar"]
Combine different functions to make it more prowerful. Here we create a function called ‘names‘, later you pass in the data, it will return back the names for you.
So far, you should think what ‘curry‘ does is just define the function logic. For example, we wirte a ‘Calculate average value‘ function.
We can define the logic first: "1. We need sum value, 2. we need the size value, 3. Sum divide size":
const nums = [15, 16, 5]; const avgLogic = R.curry(function(divide, sum, size, nums){ return divide( sum(nums), size(nums) ); }) const avgCal = avgLogic(R.divide, R.sum, R.length); const avgNum = avgCal(nums); console.log(avgNum);
Compose:
The idea of compose is to chain function together. R.compose run from ‘rgiht‘ --> ‘left‘.
So the previous result will be used for the next function. Those function combine together to make a more prowerful and reuseable function.
const articles = [ { title: ‘Everything Sucks‘, url: ‘http://do.wn/sucks.html‘, author: { name: ‘Debbie Downer‘, email: ‘[email protected]‘, age: 42 } }, { title: ‘If You Please‘, url: ‘http://www.geocities.com/milq‘, author: { name: ‘Caspar Milquetoast‘, email: ‘[email protected]‘, age: 34 } } ]; const ages = R.compose( R.map(get(‘age‘)), R.map(get(‘author‘)) );
//OR
const ages = R.map(
R.compose(
get(‘age‘),
get(‘author‘)
)
);
console.log(ages(articles)); // [42, 34]
Exmaple 2:
const words = "Hello world, what a great day!"; const lengths = R.compose( R.map(R.length), R.split(‘ ‘) ); console.log(lengths(words)); //[5, 6, 4, 1, 5, 4]
Currently All the example2 list above using curry one way or another. The pattern is always like:
var foo = bar(‘baz‘); var res = foo(data); // ... //or var res = bar(‘baz‘)(data);
The ‘data‘ always come at the end, but not necessary it should be like this every time.
R.__ : the placeholder for the curry data
const lenSubTow = R.compose( R.map(R.subtract(R.__, 2)), R.map(R.length), R.split(‘ ‘) ); console.log(lenSubTow(words)); //[3, 4, 2, -1, 3, 2]
SO the result comes from ‘R.map(R.length)‘ will be passed to ‘R.__‘.
以上是关于[Ramda] Compose and Curry的主要内容,如果未能解决你的问题,请参考以下文章
[Ramda] Basic Curry with Ramda
[Ramda] Filter, Reject and Partition
[Transducer + Ramda] Write highly performance / functional code by using transducer-js and ramda.js