是否可以在Javascript中执行此简单的Haskell分配?

时间:2016-03-31 11:58:45

标签: javascript arrays list-comprehension

我正在通过learnyouahaskell.com浏览this tutorial,它显示了如何使用以下代码制作三角形列表

Accept: multipart/related,text/html

显然,这会生成(x,y,z)所有可能组合的元组列表(或三元组?),其中x,y和z介于1-10之间。

我认为尝试在Javascript中重现这一点会很有趣,但我没有运气。是否有一种优雅(但可读)的方式在javascript中使用reduce / map等生成它。?

我正在寻找一个数组数组,其中每个子数组包含3个数字。我会发布我的代码,但我甚至没有接近解决这个问题,所以我认为这不会有帮助。

2 个答案:

答案 0 :(得分:2)

你好像在寻找今天JavaScript中最接近的list comprehension。理解现在在EcmaScript中处于待命状态,我们不知道它们是否即将推出。但我们有generators。它们不那么性感,但它们可能满足你的需求。

这就是它的样子:

var triangles = (function*(){
  for (var i=0; i<10; i++){
    for (var j=0; j<10; j++){
      for (var k=0; k<10; k++){
          yield [i,j,k];
      }
    }
  }
})();


console.log(triangles.next().value); // [0, 0, 0]
console.log(triangles.next().value); // [0, 0, 1]
console.log(triangles.next().value); // [0, 0, 2]

与Haskell一样,你不仅限于有限列表。

你可以像这样迭代:

for (var t of triangles) console.log(t);

(当然,如果你的名单是无限的,你最好在某个时候打破)。

如果你需要一个具体的数组(哪种打破了生成器的美感),那么你可以按照Bergi的建议使用Array.from

var triangleArray = Array.from(triangles);

答案 1 :(得分:1)

如果你想以懒惰的方式(生成器)这样做,你可以使用@DenysSeguret's answer。如果要生成包含这些数字的列表列表,可以按如下方式执行此操作:

var triangles = [];
for (var i = 0; i < 10; i++) {
    for (var j = 0; j < 10; j++) {
        for (var k = 0; k < 10; k++) {
            triangles.push([i,j,k]);
        }
    }
}

fiddle

这是因为Haskell和JavaScript都是图灵完整语言,所以用Haskell编写的每个程序都可以转换成用JavaScript编写的程序,反之亦然。