2016-03-31 4 views
3

Ich werde durch this tutorial von learnyouahaskell.com und es zeigt, wie Sie eine Liste der Dreiecke mit dem folgenden CodeIst es möglich, diese einfache Haskell-Zuordnung in Javascript zu machen?

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

offenbar eine Liste von Tupeln machen kann dies erzeugt (oder ist das Tripel?) Aller die möglichen Kombinationen von (x, y, z), wobei x, y und z zwischen 1-10 liegen.

Ich dachte, es wäre lustig zu versuchen, dies in Javascript zu reproduzieren, aber ich habe kein Glück. Gibt es eine elegante (noch lesbare) Möglichkeit, dies in Javascript mit reduce/map etc .. zu erzeugen?

Ich suche nach einem Array von Arrays, wobei jedes Kind-Array 3 Nummern enthält. Ich würde meinen Code posten, aber ich bin nicht einmal in der Nähe, das zu lösen, also glaube ich nicht, dass es helfen würde.

+0

Möchten Sie ein Listenverständnis oder ein konkretes (möglicherweise großes) Array? Oder vielleicht ein [Generator] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#Generators)? –

+0

Um ehrlich zu sein, bin ich ziemlich neu in diesen Konzepten, aber ich denke, ich suche nach Listenverständnis. – MrMisterMan

+1

Javascript hat eine nicht-standard [Array-Verständnis-Syntax] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions), aber es kommt mit einer Warnung, dass es wahrscheinlich nie geht um es in ECMAScript –

Antwort

2

Sie suchen nach dem nächsten Äquivalent von Listenverständnis in der heutigen JavaScript. In EkmaScript sind die Texte vorerst noch in Stand-by, wir wissen nicht, ob sie bald verfügbar sein werden. Aber wir haben generators. Sie sind nicht so sexy, aber sie könnten Ihre Bedürfnisse decken.

Hier ist, wie es aussehen könnte:

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] 

Wie in Haskell Sie nicht auf endliche Listen beschränkt.

Sie können wie folgt durchlaufen:

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

(natürlich nur, wenn Ihre Liste ist unendlich, würden Sie besser irgendwann brechen).

Und wenn Sie eine konkrete Anordnung (die Art, die Schönheit der Generatoren bricht), dann können Sie Array.from verwenden, wie von Bergi vorgeschlagen:

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

Vielleicht 'Array.from (Funktion *() {...}())'? – Bergi

+0

@Bergi Eine Betonanlage bauen? –

+0

Ja. Natürlich könnte man argumentieren, dass die faule Haskell-Liste besser dem Generator entspricht, den Sie haben :-) – Bergi

1

Wenn Sie dies die faule Weise tun wollen (a Generator), können Sie @DenysSeguret's answer verwenden. Wenn Sie eine Liste von Listen mit den Nummern herstellen möchten, können Sie dies wie folgt:

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

Nachdem dies gesagt ist, da beide Haskell und JavaScript sind Turing komplette Sprachen, jedes Programm geschrieben in Haskell kann in ein in JavaScript geschriebenes Programm umgewandelt werden und umgekehrt.