这是一个新手问题(我对Ramda和一般的函数编程还是很陌生的。)
我有一个带有两个参数的函数。为了简单起见,我们假设它只是减去数字。我想反驳它的论点。我已经想出了如何手动执行此操作,但确实感觉可以通过管道或撰写来完成,但我不知道如何操作。
import { curry, flip, pipe } from 'ramda';
const subtract = (a, b) => a - b; // subtract(1, 4); -3
const flippedCurriedSubtract = flip(curry(subtract))
// flippedCurriedSubtract(1)(4); 3
pipe(flip, curry, subtract)(1)(4); // NaN
您将如何使用pipe
或compose
来做到这一点?
编辑:
pipe(
curry,
flip
)(subtract); // works
答案 0 :(得分:2)
pipe(flip, curry, subtract)(1)(4)
等于subtract(curry(flip(1)(4)))
同时定义flip
:
// flip :: (a -> b -> c) -> b -> a -> c
const flip = curry((fn, a, b) => fn(b, a));
这意味着flip
函数将收到一个curry
函数(a-> b-> c)作为参数,但是现在它出现一个数字,然后会导致错误。
pipe(curry,flip)(subtract)
等于flip(curry(subtract))
,这很合适。
它还返回与.compose(flip, curry)(subtract)
相同的结果。 compose
和pipe
相同,只是方向执行功能有所不同。
对于新手。我建议您阅读此ebook
答案 1 :(得分:2)
据我所知,Ramda中的大多数功能已经被管理。因此,您无需再次咖喱减法。
import os
os.startfile("C:/Users/TestFile.txt", "print")
您可以subtract(5, 10); //=> -5
subtract(5)(10); //=> -5
,它仍然会被咖喱:
flip
我认为您根本不需要烟斗和咖喱,您只需这样做:
flip(subtract)(5, 10); //=> 5
flip(subtract)(5)(10); //=> 5
Scott在评论中指出const flippedSubtract = flip(subtract);
flippedSubtract(5)(10); //=> 5
将自动使用非咖喱函数:(非常有用)
flip