有可能在Javascript中完成这个简单的Haskell赋值吗

Is it possible to do this simple Haskell assignment in Javascript?

本文关键字:简单 Haskell 赋值 Javascript 有可能      更新时间:2023-10-17

我正在学习learnyouahaskell.com上的本教程,它展示了如何使用以下代码制作三角形列表

let triangles = [ (a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10] ]  

显然,这产生了一个元组列表(或者这是三元组吗?),其中x,y和z在1-10之间。

我原以为用Javascript复制它会很有趣,但我运气不好。有没有一种优雅(但可读)的方法可以使用reduce/map等在javascript中生成它。。?

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

您似乎在寻找与当今JavaScript中的列表理解最接近的等价物。理解目前在EcmaScript中处于待命状态,我们不知道它们是否会很快推出。但我们有发电机。它们没有那么性感,但它们可能会满足你的需求。

以下是它的样子:

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);

如果你想用懒惰的方式(生成器)来做这件事,你可以使用@DenysSeguret的答案。如果你想生成一个包含这些数字的列表,你可以如下所述:

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]);
        }
    }
}

小提琴

既然Haskell和JavaScript都是图灵完全语言,那么用Haskell编写的每个程序都可以转换成用JavaScript编写的程序,反之亦然。