【问题标题】:produce a list out of a value and a function in a functional style (no mutation, no loops)以函数式风格(无突变,无循环)生成一个值和一个函数的列表
【发布时间】:2019-10-17 18:57:48
【问题描述】:

如何编写一个接受值并生成值列表的函数?

例如:value = 2,函数将递增 1,直到达到某个条件(或无限,我会从中取出/删除),预期结果应如下所示:[3,4,5,6 ,7,8...]

现在我正在做这件丑事:

let min = ...;
const max = ....;
const acc = [min];

while (min.plus(1). < max) {
  min = min.plus(1);
  acc.push(min);
}

奖金问题....我怎么能用类型表示法来表示这个?会是:(a -> [a]) -> a -> [a]?

谢谢!

【问题讨论】:

  • 使用reduce 和/或map。这些是你在函数式编程中的基本结构。
  • 在没有循环的情况下实现预期结果的唯一方法是使用递归
  • 这是什么语言? JS中没有Array#plus

标签: javascript


【解决方案1】:
function recursivePlus(min, max, collection) {
    if (!collection) {
        collection = [];
        collection.push(min);
        return recursivePlus(++min, max, collection);
    } else {
        if (min <= max) {
            collection.push(min);
            return recursivePlus(++min, max, collection);
        } else {
            return collection;
        }   
    }
}
recursivePlus(0, 3);

【讨论】:

    【解决方案2】:

    也许使用 lodash 范围 https://lodash.com/docs/4.17.11#range

    _.range(2, 9);
    // => [2, 3, 4, 5, 6, 7, 8]
    

    或者使用Array.apply(密集数组)方式:

    How to generate sequence of numbers/chars in javascript?

    https://2ality.com/2012/06/dense-arrays.html

    【讨论】:

    • 这就是我正在寻找的实用程序类型......但是,我手中的不是数字而是日期......基本上我需要通过应用将一天添加到最后处理的项目的函数。 Range 只处理数字。
    【解决方案3】:

    我认为可以使用创建时间戳的日期范围

    const startDate = new Date("2019-10-16");
    const endDate = new Date("2019-10-18");
    const dayInMillis = 24 * 60 * 60 * 1000;
    _.range(startDate.getTime(), endDate.getTime() + 1, dayInMillis);
    // => [1571184000000, 1571270400000, 1571356800000]
    

    【讨论】:

      【解决方案4】:

      我找到了我正在寻找的解决方案!即:unfold,它与fold/reduce 正好相反(请注意,我正在使用 Ramda.js 一个类似于下划线和 lodash 的 js 函数库):

      const f = n => n.toMillis() > maxDate.toMillis() ? false : [n, n.plus({ days: 1 })] unfold(f, minDate);

      感谢大家帮助我,感谢。

      PS:我会留下这篇文章以防万一有人感兴趣:https://kseo.github.io/posts/2016-12-12-unfold-and-fold.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-23
        • 2011-09-18
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 2019-12-23
        相关资源
        最近更新 更多