Bu soru, Scala'nın şablonla eşleşmesini ve yinelenmesini listeler ve bunların performansı ile ilgilidir.Scala listesi yineleme performansı
Bir liste üzerinde recurses bir işlevi var ve ben gibi örnek bir şey için, bir eksileri üzerinde eşleşen yaparsam: I kullanıyorum
myFunction [] = []
myFunction (x:xs) = «something» : myFunction xs
: Haskell'de
def myFunction(xs) = xs match {
case Nil => Nil
case x :: xs => «something» myFunction(xs)
}
örneğin, Haskell ile yaptığım gibi aynı semantik. Haskell uygulamasıyla ilgili herhangi bir soru olacağını düşünmüyorum, çünkü bu sadece listelere katılma şeklinizdir. Uzun bir liste için (birkaç bin düğüm içeren bir listede çalışacağım), Haskell göz kırpmıyordu (hayal ettim; hiç denemedim).
Ama Scala ile anladığım, maç deyimi listesine hiçbir şey yapmaz bir işleve örnek genişletmek için, eksileri etrafında listesini bölmek ve uygulamasını kaldırma çıkarıcı yöntemini çağırır dan:
def myFunction(xs) = xs match {
case Nil => Nil
case x :: xs => x :: myFunction(xs)
}
Haskell'de
:
myFunction [] = []
myFunction (x:xs) = x : myFunction xs
o yeniden bir araya eksilerini çıkarıcı yöntemini uygulamak çağırır. Uzun bir liste için bunun çok pahalı olacağını hayal ediyorum.
Özel durumumda, bir karakter listesi üzerinde yinelemek ve çeşitli şeyleri biriktirmek istiyorum; giriş dizesi birkaç on kilobaytlık bir şey olduğunda.
Uzun bir listede tekrarlamak istiyorsam, yinelemenin her adımı için kurucuları ve çıkarıcıları gerçekten arayacak mıyım? Yoksa optimizasyonlar var mı? Ya da daha iyi yollar? Bu durumda ben birkaç akümülatör değişkenleri gerekir ve açıkçası ben sadece hiçbir şey yapmadan bir liste üzerinde recursing olmaz ...
(İki yıldır bir çizgi yazılmamış ettik benim Haskell bağışlayın.)
(Ve evet, kuyruk özümü için gidiyorum.)
Teşekkür ederiz! Evet, yazdığım şey kuyruk özyineli olacak, ikinci pasaj kötü bir örnekti! Yapmayı planladığım şey, giriş dizesini bazı önemsiz olmayan işlevlere dayanan çeşitli parçalara bölmektir: sonuç, herhangi bir harita veya katlama stili çıkışı olmayan akümülatörlerdir. Belki de bu özel durumda kullanabileceğim genel bir model aramasında soruyu çok genelleştirmeye çalışıyordum. – Joe
Peki, eklediğim son örneğe bir bakın. –
Mükemmel, her iki yüzeye de cevap veriyor. Çok teşekkür ederim! – Joe