代码之家  ›  专栏  ›  技术社区  ›  user2693928

带RAMDAJS的无点管道范围

  •  0
  • user2693928  · 技术社区  · 6 年前

    我的功能是创建范围:

    const range = from => to => step => ....
    

    我想创建另一个函数来处理这个范围,但我想使用pipe。

    例如,我想得到范围的和。

    const sum = ...
    
    const getSum = pipe(
        range(),
        sum,
    )
    

    我可以做到以下几点:

      const getSum = from => to => {
           return sum(range(from)(to)(1))
        }
    

    但我能用拉姆达斯做到这一点吗?

    例如:

    const getSum = pipe(
       range..///here,
       sum
    )
    

    pipe、sum和range是我的实现。

    但我不知道如何做到点自由风格。

    请注意,range是返回函数的函数,以便更容易地进行curring。

    range(0)(10)(1) 
    

    谢谢你

    更多说明:

    假设我有计数和分割函数。 这是常规函数:

     const numChars = str => count(split('', str))
    

    这是无点样式(imag

    const numChars = pipe(split(''), count)
    

    我也一样,但范围在上面

    1 回复  |  直到 6 年前
        1
  •  3
  •   Bergi    6 年前

    要使用一个包含多个参数的函数进行组合,请多次使用组合-尽管您需要使用 R.o 而不是 pipe compose 以下内容:

    // sum: [Number] -> Number
    // range: Number -> Number -> [Number]
    // getSum: Number -> Number -> Number
    const getSum = R.o(R.o(R.sum), R.range);
    

    为了提供curried函数的最后一个参数,最简单的ramda解决方案是使用 a placeholder 以下内容:

    // stepRange: Number -> Number -> Number -> [Number]
    // range: Number -> Number -> [Number]
    const range = stepRange(R.__, R.__, 1);
    

    但这只适用于ramda自己创建的函数 curryN curry ,而不是手动执行的功能。有了这些,你只能 R.flip 直到可以部分应用第一个参数:

    // stepRange: from -> to -> step -> range
    // flip(stepRange): to -> from -> step -> range
    // o(flip, stepRange): from -> step -> to -> range
    // flip(o(flip, stepRange)): step -> from -> to -> range
    // range: from -> to -> range
    const range = R.flip(R.o(R.flip, stepRange))(1);
    

    我真的不推荐这么做。一切皆有可能,但这是不可读的。只需写出参数:

    const getSum = R.o(R.o(R.sum), R.flip(R.o(R.flip, stepRange))(1));
    // vs
    const getSum = from => to => R.sum(stepRange(from)(to)(1));
    
    推荐文章