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

问题描述 投票:1回答:2

这是一个新手问题(我对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
javascript functional-programming ramda.js function-composition compose
2个回答
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));

这意味着qazxsw poi函数将接收一个qazxsw poi函数(a - > b - > c)作为参数,但现在它是一个数字然后导致错误。

flip等于curry,这将适合。它也与pipe(curry,flip)(subtract)返回相同。 flip(curry(subtract)).compose(flip, curry)(subtract)在方向执行功能方面是完全不同的。

而对于新手。我建议你阅读这个compose


2
投票

据我所知,Ramda的大部分功能都已经过了。所以你不需要再次咖喱减去。

pipe

你可以ebook它,它仍将是curry:

subtract(5, 10); //=> -5
subtract(5)(10); //=> -5

我认为你根本不需要烟斗和咖喱,你可以这样做:

flip

斯科特在评论中指出,flip(subtract)(5, 10); //=> 5 flip(subtract)(5)(10); //=> 5 将自动讨论非咖喱功能:(非常有帮助)

const flippedSubtract = flip(subtract);
flippedSubtract(5)(10); //=> 5
© www.soinside.com 2019 - 2024. All rights reserved.