[Ramda] Eliminate Function Arguments (Point-Free Style) with Ramda's Converge

Posted Answer1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Ramda] Eliminate Function Arguments (Point-Free Style) with Ramda's Converge相关的知识,希望对你有一定的参考价值。

When doing comparisons inside of functions, you end of relying heavily on the argument passed into the function. Ramda‘s converge allows you to do comparisons in a Point-Free style allowing you more flexibility with composing and constructing functions. This lesson walks through refactoring a function to Point-Free style using Ramda‘s Converge.

 

For example we want to find the whether the first item of an array is the biggest number:

const shouldBeTrue = [6, 3, 4, 5, 2, 1]
const shouldBeFalse = [3, 4, 5, 2, 1]

const isFirstBiggest = (xs) => xs[0] == xs.sort((a, b) => b - a)[0]

console.log(isFirstBiggest(shouldBeTrue)) // true
console.log(isFirstBiggest(shouldBeFalse)) // false

In the code we can see this:

const isFirstBiggest = (xs) => xs[0] === xs.sort((a, b) => b - a)[0]

You can find that, param ‘xs‘ appears both on the left and right side of euqals sign.

If match this partten, we actually can use ‘converge‘ from  Ramda.

invoked, this new function is applied to some arguments, each branching function is applied to those same arguments. The results of each branching function are passed as arguments to the converging function to produce the return value.

For example:

const shouldBeTrue = [6, 3, 4, 5, 2, 1]
const shouldBeFalse = [3, 4, 5, 2, 1]

import {
  converge, equals, head, sort, descend, identity, compose
}
from ramda

const biggestNumberOfArray = compose(
  head,
  sort(descend(identity))
);
const isFirstBiggest = converge(
  equals, [
    head,
    biggestNumberOfArray
  ]
);

// xs =>
//     xs[0] == xs.sort((a, b) => b - a)[0]



console.log(isFirstBiggest(shouldBeTrue))
console.log(isFirstBiggest(shouldBeFalse))

So in the code:

converge(
  equals, [
    head,
    biggestNumberOfArray
  ]
)

converge takes two params, first params is ‘R.equals‘. It tells what should do with the second param. Here is checking whether they are equal.

Second param is an array, take tow expersions.

R.head --> xs[0]
biggestNumberOfArray --> xs.sort((a,b) => b-a)[0]

 

More example:

var average = R.converge(R.divide, [R.sum, R.length])
average([1, 2, 3, 4, 5, 6, 7]) //=> 4

var strangeConcat = R.converge(R.concat, [R.toUpper, R.toLower])
strangeConcat("Yodel") //=> "YODELyodel"

 

以上是关于[Ramda] Eliminate Function Arguments (Point-Free Style) with Ramda's Converge的主要内容,如果未能解决你的问题,请参考以下文章

To eliminate waste, we need to rediscover thrift

TEDTo eliminate waste, we need to rediscover thrift

HDU 4115 Eliminate the Conflict(2-sat)

[Ramda] Basic Curry with Ramda

[Ramda] Sort, SortBy, SortWith in Ramda

[Ramda] Change Object Properties with Ramda Lenses