2016-03-31 4 views
3

Я иду через this tutorial из learnyouahaskell.com, и это показывает, как вы можете составить список треугольников со следующим кодомМожно ли сделать это простое назначение Haskell в Javascript?

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

Видимо, это производит список кортежей (или что тройки?) Всех возможные комбинации (x, y, z), где x, y и z находятся между 1-10.

Я думал, что было бы интересно попробовать и воспроизвести это в Javascript, но мне не повезло. Есть ли элегантный (но читаемый) способ создания этого в javascript, используя сокращение/карту и т. Д.?

Я ищу массив массивов, где каждый дочерний массив содержит 3 числа. Я бы опубликовал свой код, но я даже не близок к его решению, поэтому я не думаю, что это поможет.

+0

Вы хотите получить список или конкретный (возможно большой) массив? Или, может быть, [генератор] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#Generators)? –

+0

Честно говоря, я довольно новичок в этих концепциях, но я думаю, что я ищу понимание списка. – MrMisterMan

+1

Javascript имеет нестандартное [синтаксис понимания массива] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions), но он содержит предупреждение о том, что он, вероятно, никогда не будет сделать это в ECMAScript –

ответ

2

Вы, кажется, ищете ближайший эквивалент понимания списка в современном JavaScript. В настоящее время в EcmaScript понимаются концепции stand-by, мы не знаем, скоро ли они будут доступны. Но у нас есть 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); 

(конечно, если ваш список бесконечен, то лучше разбить на какой-то момент).

И если вам нужен конкретный массив (который отчасти разрушает красоту генераторов), то вы можете использовать Array.from как предложено Берги:

var triangleArray = Array.from(triangles); 
+0

Возможно, 'Array.from (function *() {...}())'? – Bergi

+0

@Bergi Чтобы построить конкретный массив? –

+0

Да. Конечно, можно утверждать, что ленивый список Haskell лучше соответствует генератору, который у вас есть :-) – Bergi

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, и наоборот.

Смежные вопросы