使用javascript中的相同参数撰写链接函数

时间:2018-07-26 19:12:21

标签: javascript functional-programming ramda.js

我试图更好地理解ramda.js中的功能组成,并且目前在类中提供了一个如下所示的方法:

const replace = (newItem) => function3(function1(newItem).function2(newItem));

我在ramda.js中知道一个更简单的功能,例如

const replace = (newItem) => function2(function1(newItem));

你可以这样写

const replace = compose(function2, function1);

是否有使用功能组合/应用程序或其他ramda.js帮助程序方法对初始函数执行相同操作的类似方法?

2 个答案:

答案 0 :(得分:2)

Ramda具有两个功能应对此有所帮助。比较标准的是lift。许多功能语言都有这个概念。考虑它的一种方法是,它提升了一个对值进行操作的函数,以创建对这些值的容器操作的函数:

add(3, 5) //=> 8
lift(add)([3], [5]) //=> [8]

函数也可以看作是值的容器。返回给定类型值的函数可以视为该类型的容器。

因此,我们可以抬起function3使其不对值进行操作,而对这些值的容器进行操作,然后将输入提供给这些函数。这是一个将数组作为容器的示例:

const function1 = newItem => `function1(${newItem})`
const function2 = newItem => `function2(${newItem})`
const function3 = (v1, v2) => `function3(${v1}, ${v2})`

const combine = R.lift(function3)(function1, function2)

console.log(combine('foo')) //=> "function3(function1(foo), function2(foo))"
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>


次标准函数是converge。这仅专注于函数,而不专注于任意容器。在这种情况下,它的工作原理类似。该函数是一次创建的,而不是针对lift的两次创建的。这意味着初始函数需要包装在一个数组中:

const function1 = newItem => `function1(${newItem})`
const function2 = newItem => `function2(${newItem})`
const function3 = (v1, v2) => `function3(${v1}, ${v2})`

const combine = R.converge(function3, [function1, function2])

console.log(combine('bar')) //=> "function3(function1(bar), function2(bar))"
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>

converge仅适用于函数,但可以与多联函数一起使用。 lift仅适用于一元代码。 converge是特定于Ramda的功能。我没在其他地方看到过。因此,如果lift适合您,我建议您改为选择它。

答案 1 :(得分:1)

所以你的问题是怎么写

function1(input).function2(input)

以实用的方式。如果我是正确的,请按以下步骤操作:

首先让我们创建一个函数method,该函数将为我们提供绑定到该对象的对象的方法:

const method = R.curry((name, object) => R.bind(object[name], object))

使用此函数,我们可以将表达式重写为

method('function2', function1(input))(input)

但是我们想要更清洁,更可重用的东西,对吗?因此,让我们进行一些重构

method('function2', function1(input))(input)

method('function2')(function1(input))(input)

R.pipe(function1, method('function2'))(input)(input) // or use R.compose

R.converge(R.call, [
  R.pipe(function1, method('function2')),
  R.identity
])(input)

现在我们可以像这样定义函数combine

const combine = (fn, name) =>
  R.converge(R.call, [
    R.pipe(fn, method(name)),
    R.identity
  ])

表达式变成

combine(function1, 'function2')(input)

我希望我的解释很清楚,并且可以解决您的问题:)