【发布时间】:2015-03-01 09:53:11
【问题描述】:
例如,我想获取从现在到 30 天后每个星期五的日期。
目前,我可以利用下划线库和 moment.js 来做到这一点。但结果是超级冗长和烦人的程序/命令。观察:
var initDate = moment().day("Friday");
var endDate = moment().add(30, 'days');
var result = [];
result.push(initDate);
while (_.last(result).isBefore(endDate)) {
var x = _.last(result);
result.push(nextWeek(x));
}
alert(result); // answer here
// create a new moment from given moment and add 7 days
function nextWeek(initMoment) {
var x = moment(initMoment);
return x.add(7,'days');
}
这是对应的小提琴:http://jsfiddle.net/aafsh5xa/
我想知道是否有一种方法可以使用类似 Haskell 的功能,例如列表推导或无限列表(惰性求值),以使其更加简洁。可能是这样的:
var initDate = moment();
var endDate = moment().add(30,days);
var everyFriday = genLazyList(initDate, nextFridayFrom);
var result = _.filter(everyFriday, function(input){ return input.isBefore(endDate); });
请注意,everyFriday 是由 genLazyList 生成的无限列表,并且在调用 _.filter() 函数之前不会对其进行评估。而 nextFridayFrom() 是 genLazyList 用来制作惰性列表的函数。
【问题讨论】:
-
也许只有我,但这不应该是相当简单的-> jsfiddle.net/aafsh5xa/1
-
我专门询问使用函数式编程技术来完成它。你的小提琴和我的小提琴一样不起作用。
-
简而言之,在 JS 中没有办法做到这一点,
genLazyList将在调用时执行和评估,并从现在到永恒的每个星期五返回,没有办法延迟评估它直到它通过过滤器运行。 -
我找到了一种使用这个库的方法:streamjs.org 给我一些时间,我会写一个答案,按照我的建议去做。
标签: javascript haskell functional-programming underscore.js lazy-evaluation