【问题标题】:How to use Ramda pipe?如何使用 Ramda 管道?
【发布时间】:2018-01-09 09:28:02
【问题描述】:

背景

我正在尝试使用 Ramda 编写 2 个函数,但我遇到了 pipe 的问题,这意味着我不知道如何使用它。

代码

假设我有一个返回数组的函数:

var createQuery = params => [ getSQLQuery( params ), [ getMarket() ] ];

var getSQLQuery = ( { lang } ) => `My query is ${lang}`;

var getMarket = () => "en_en"

所以,当调用createQuery({ lang: "es" }) 时,我会得到以下输出:[ "My query is es", ["en_en"] ];

现在,让我们也假设我是一个讨厌的男孩,我想挖掘这些重要信息!

R.tap(console.log, createQuery({lang: "es"}))

一个组合(确切地说是一个管道)将是:

R.pipe( 
    createQuery( {lang: "en"} ), 
    R.tap(console.log) 
);

返回一个函数。

问题

现在假设我要执行所述功能:

var comp = params => R.pipe( 
        createQuery( params ), 
        R.tap(console.log) 
    )(params);

comp({lang: "uk"}); //Blows Up!?

为什么我的函数会被f.apply is not a function 炸毁?? 我做错了什么?

【问题讨论】:

  • 问题是您没有类型检查器来告诉您(部分应用的函数的)中间类型有什么问题。
  • 我很困惑。我看不出这是一个可能来自类型检查的错误。
  • ftor,好被动好斗的哈哈

标签: javascript functional-programming ramda.js


【解决方案1】:

您遇到的问题是因为您正在调用createQuery(params),然后尝试将结果视为一个函数。

您的示例函数 comp 可以这样更新:

const comp = params => R.pipe(createQuery, R.tap(console.log))(params)

R.pipe 会将params 和参数传递给createQuery,然后将其结果传递给`R.tap(console.log) 的结果。

这可以通过删除params的直接应用来简化为:

const comp = R.pipe(createQuery, R.tap(console.log));

【讨论】:

  • 好的,很公平。但是如果 comp 使用 2 个参数而不是 1 个参数,而 createQuery 只使用第二个参数呢?那你会怎么做呢?另外,点赞!
  • @Flame_Phoenix 你是什么意思?喜欢这个const comp = (params1, params2) => R.pipe(createQuery, R.tap(console.log))(params2) 吗?如果我没记错的话,另一种选择是const comp = R.flip(R.pipe)(createQuery, R.tap(console.log));
猜你喜欢
  • 1970-01-01
  • 2020-04-27
  • 2019-06-05
  • 1970-01-01
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
相关资源
最近更新 更多