使用 R.pipe(或 R.curry)来简化功能方法调用
Using R.pipe (or R.curry) to simplify functional method calls
今天刚开始使用 Ramda,试图通过更具声明性的方式 learn/incorporate 在我的代码中进行函数式编程,但我无法弄清楚如何使用管道(或 curry ?)这只用过一次所以也许我正在努力。
任何人都可以解释一下如何 trim 降低它看起来不那么混乱,这样我就可以了解 FP 了吗?如果我像工作示例中那样分离出每个方法并单独调用,我似乎只能这样做。为简洁起见简化了该示例。
工作示例
const logLevels: string[] = ['log', 'info', 'debug', 'error'];
// maps logLevels into pairs: [[log: f(x)], ['info': f(x)], ...]
const toPairs = (logLevel: string) => [logLevel, debug(`${process.env.APP_NAME}:${namespace}:${logLevel}`)];
const loggers: any = R.map(toPairs, logLevels);
// Then takes the pairs and makes it an object
// Output: { log: f(x), info: f(x), debug: f(x), ...}
this.debugger = R.fromPairs(loggers);
// Example Usage:
// this.debugger.log('...');
在我注意到 Ramda API 使传递到管道的参数成为链式方法中的第二个参数后,管道开始工作。 R.map
而不是像 Elixir 这样的第一个参数,我在这个周末作为介绍使用它:
const logLevels = ['log', 'info', 'debug', 'error'];
const toPairs = (logLevel: string): any => [logLevel,
this.debugger = R.pipe(R.map(toPairs), R.fromPairs)(logLevels);
如果有人有任何其他建议,我会洗耳恭听:)
我会用 reduce
:
const logLevels = ['log', 'info', 'debug', 'error'];
const debugger = reduce(
(dbg, level) => assoc(
level,
debug(`${process.env.APP_NAME}:${namespace}:${level}`),
dbg
), {}, logLevels)
debugger.info('hello, world')
您可以在 Ramda REPL 上看到这一点,我不得不更改名称 debugger
,因为它在浏览器中保留。
今天刚开始使用 Ramda,试图通过更具声明性的方式 learn/incorporate 在我的代码中进行函数式编程,但我无法弄清楚如何使用管道(或 curry ?)这只用过一次所以也许我正在努力。
任何人都可以解释一下如何 trim 降低它看起来不那么混乱,这样我就可以了解 FP 了吗?如果我像工作示例中那样分离出每个方法并单独调用,我似乎只能这样做。为简洁起见简化了该示例。
工作示例
const logLevels: string[] = ['log', 'info', 'debug', 'error'];
// maps logLevels into pairs: [[log: f(x)], ['info': f(x)], ...]
const toPairs = (logLevel: string) => [logLevel, debug(`${process.env.APP_NAME}:${namespace}:${logLevel}`)];
const loggers: any = R.map(toPairs, logLevels);
// Then takes the pairs and makes it an object
// Output: { log: f(x), info: f(x), debug: f(x), ...}
this.debugger = R.fromPairs(loggers);
// Example Usage:
// this.debugger.log('...');
在我注意到 Ramda API 使传递到管道的参数成为链式方法中的第二个参数后,管道开始工作。 R.map
而不是像 Elixir 这样的第一个参数,我在这个周末作为介绍使用它:
const logLevels = ['log', 'info', 'debug', 'error'];
const toPairs = (logLevel: string): any => [logLevel,
this.debugger = R.pipe(R.map(toPairs), R.fromPairs)(logLevels);
如果有人有任何其他建议,我会洗耳恭听:)
我会用 reduce
:
const logLevels = ['log', 'info', 'debug', 'error'];
const debugger = reduce(
(dbg, level) => assoc(
level,
debug(`${process.env.APP_NAME}:${namespace}:${level}`),
dbg
), {}, logLevels)
debugger.info('hello, world')
您可以在 Ramda REPL 上看到这一点,我不得不更改名称 debugger
,因为它在浏览器中保留。