Ramda:如何将普通应用程序转换为管道或撰写

时间:2019-02-20 09:07:16

标签: javascript functional-programming ramda.js function-composition compose

这是一个新手问题(我对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

您将如何使用pipecompose来做到这一点?

编辑:

pipe(
    curry,
    flip
)(subtract); // works

2 个答案:

答案 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)相同的结果。 composepipe相同,只是方向执行功能有所不同。

对于新手。我建议您阅读此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