2011-03-11 12 views
6

ben scala içinde Fibonacci Nums bir yerinde ve işe yarar tanım olacağını düşündüm neScalas (a, b) .zipped (veya Tuple2.zipped) kavramı kullanarak akışları/sonsuz listeleri

fibs take 10 foreach println 
0 
1 
java.lang.StackOverflowError 
    at scala.collection.mutable.LazyBuilder.(LazyBuilder.scala:25) 
    at scala.collection.immutable.Stream$StreamBuilder.(Stream.scala:492) 
    at scala.collection.immutable.Stream$.newBuilder(Stream.scala:483) 
    at... 

Ben akışları ile düzgün çalışmıyor sıkıştırılmış tahmin: aşağıdaki hatayı alıyorum? Bu işin nasıl yapıldığına dair herhangi bir öneri, ya da neden bu işe yaramaz (yapmamalı)?

+0

Bu _exact_ sorusunu soracaktım. Birinin benden önce geldiğini bilmek güzel. +1 – KChaloux

cevap

8

aşağıdaki çalışmaların doğru

val fibs:Stream[Int] = 0 #:: 1 #:: (fibs zip fibs.tail).map{ case (a,b) => a+b } 

Tuple2.zipped ile sorun o sıkıştırma oluyor dizileri üzerinde foreach çalıştırabilirsiniz varsayar olmasıdır. Bu muhtemelen tasarım gereğince, Stream.zip yöntemini uygularken, muhtemelen veya Stream olmayan sonlu uzunluktaki Seq için kötü performans verebilir. (en veri yapıları tail verimli uygulanmasını desteklemek yapmadığından.)


Stream.zip esasen (o tipleri daha genel hale getirmek için bazı şeyler yok gerçi) aşağıdaki gibi uygulanır. Scala'nın Trac veritabanında bu konuda bir bilet var

class Stream[A]{ 
    def zip(other:Stream[B]) = 
    (this.head, other.head) #:: (this.tail zip other.tail) 
} 
+0

Sorunuzdaki “tembel” niteleyicisi gereksiz olsa da, sizi bu işin neye yaptığına dair cevabımdan çıkardığınızı temin ederim. –

+0

Tamam, göstermiş olduğunuz şey çok güzel :) Sanırım bu, sadece bir "zipWith" e ihtiyaç duyduğumuzu gösteriyor. Scala'da neden orada olmadığımı anlamıyorum. – Felix

+1

@Felix: ZipWith'in nasıl yardımcı olacağını anlamıyorum. Bir tuple üzerinde "zipWith", ilk liste sonsuz bir akış olduğunda taşacak bir "foreach" olarak uygulanmaya devam edecektir. –

İlgili konular