2016-03-31 19 views
3

(yani üçe veya mi?) Ben learnyouahaskell.com dan this tutorial yapmaya çalışıyorum ve bunuBu basit Haskell atamasını Javascript'te yapmak mümkün mü?

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

Görünüşe göre bu tüp listeleriniz üretir aşağıdaki kodla üçgenler bir listesini yapmak nasıl gösterir hepsinden x, y ve z'nin 1-10 arasında olduğu olası kombinasyonları.

Bunu Javascript'te denemek ve yeniden üretmenin eğlenceli olacağını düşündüm ama şansım yok. Bunu azaltma/harita vb kullanarak javascript içinde üretmenin zarif (ama okunabilir) bir yolu var mı ..?

Her alt dizinin 3 sayı içerdiği diziler dizisini arıyorum. Kodumu gönderirdim ama bunu çözüme bile yakın değildim, bu yüzden yardımcı olacağını düşünmüyorum.

+0

Liste anlama veya somut (büyük ihtimalle) bir dizi mi istiyorsunuz? Ya da belki bir [jeneratör] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#Generators)? –

+0

Dürüst olmak gerekirse, bu kavramlara oldukça yeni geldim ama liste anlamaya çalışıyorum. – MrMisterMan

+1

Javascript standart olmayan bir [Array Comprehension sözdizimi] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions) vardır, ancak muhtemelen hiç gitmeyeceğine dair bir uyarı ile gelir. ECMAScript –

cevap

2

Günümüzün JavaScript'inde en yakın liste anlaşması eşdeğerini arıyor gibi görünüyorsunuz. Anlaşmaları şimdilik EcmaScript'te bekliyoruz, yakında kullanıma hazır olup olmayacaklarını bilmiyoruz. Ama biz generators var. Seksi değiller ama ihtiyacınızı karşılayabilirler. Eğer sonlu listelerine sınırlı değiliz Haskell

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] 

As:

Burada gibi görünebilir budur.

Böyle yineleyebilirsiniz:

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

(listenizi sonsuz ise tabii ki, daha iyi bir noktada kırardım).

Ve Bergi önerdiği gibi (tür jeneratörler güzelliğini kırar) somut bir dizi, o zaman Array.from kullanabilirsiniz gerekirse:

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

Belki Array.from (işlev *() {…}()) '? – Bergi

+0

@Bergi Beton dizisi oluşturmak için? –

+0

Evet. Tabii ki tembel Haskell listesinin daha iyi bir jeneratöre sahip olduğunu söyleyebiliriz :-) – Bergi

1

tembel yoldan yapmak istiyorsanız, (a jeneratör), @DenysSeguret's answer'u kullanabilirsiniz. Bu sayıları içeren listelerin bir listesini üretmek istiyorsanız aşağıdaki gibi yapabilirsiniz:

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

Bu her program yazılı, Haskell ve JavaScript hem Turing tam diller olduğundan söyleniyor Haskell, JavaScript ile yazılmış bir programa dönüştürülebilir ve bunun tersi de geçerlidir.

İlgili konular