我试图更好地理解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帮助程序方法对初始函数执行相同操作的类似方法?
答案 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)
我希望我的解释很清楚,并且可以解决您的问题:)