Scala'nın üzücü gerçeklerinden biri, özyinelemeli tür takma adların desteklenmediğidir. Çoğaltma aşağıdaki Amaçlı şu sonuçları verir:
scala> type WalkFn = Function[Int, WalkFn]
<console>:7: error: illegal cyclic reference involving type WalkFn
type WalkFn = Function[Int, WalkFn]
^
başka not Ölçeği (genellikle ney, fonksiyonel programlama paradigmada tamamen nefret üzerine, hoş) tarafından başvuru değerlerini değiştirmek için izin vermez olmasıdır. Bununla birlikte, dehşete düşürmeyin! Başka seçenekler var. Özellikler kendi kendini referans alabilir ve fonksiyonlar sadece Scala'da sınıflar. Böylece genel özyinelemeli WalkFn'i özelliklerle modelleyebiliriz. Ayrıca, bir parametreyi referans olarak değiştirmek yerine, değişmez değerleri benimseyebilir ve işlevimizin bir sonraki ilerleyişe dönmesini sağlayabiliriz.
şu döngüsel başvurular içerdiğinden (WalkForward -> WalkBackward, WalkBackward -> vb WalkForward,), bunu Scala derleyici tüm derlemek olacak REPL
önce şu örneği (çalıştırmanın skalası içine :paste
yazmanız gerekir tek adımda 3 Walk{Forward,Backward,Equal}
uygulamaları
İlk:.
import scala.util.Random
object Helpers {
def pickRandom[A](items: A*) =
items(Random.nextInt(items.length))
}
trait WalkFn extends (Int => (Int, WalkFn)) {}
object WalkForward extends WalkFn {
def apply(i: Int) =
(i + Random.nextInt(6),
Helpers.pickRandom(WalkEqual, WalkBackward))
}
object WalkEqual extends WalkFn {
def apply(i: Int) =
(i + (Random.nextInt(7) - 3),
Helpers.pickRandom(WalkForward, WalkBackward))
}
object WalkBackward extends WalkFn {
def apply(i: Int) =
(Random.nextInt(6) - 3,
Helpers.pickRandom(WalkEqual, WalkForward))
}
def doWalk(count: Int, walkFn: WalkFn = WalkEqual, progress: Int = 0): Unit =
if (count > 0) {
val (nextProgress, nextStep) = walkFn(progress)
println(nextProgress)
doWalk(count - 1, nextStep, nextProgress)
}
doWalk(20)
0123:
Şimdi
$ scala
Welcome to Scala version 2.11.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_05).
Type in expressions to have them evaluated.
Type :help for more information.
scala> :paste
// Entering paste mode (ctrl-D to finish)
, kodu yapıştırın
Daha sonra, talimatlara göre ctrl-D
numaralı telefona tıklayın.
Fonksiyonel sarhoş stagger'ın tadını çıkarın!
Güzel cevap ama (değil * Henüz * Scala ile aşina olmak): 'Helpers' nesnesine ne için ihtiyacınız var? Bu sadece bir isim mi, yoksa herhangi bir kongre sizi üst düzey bir 'def' i yapmamanızı engelliyor mu? – Bergi
@Bergi all 'def'' scala'daki yöntemlerdir (bunlar açıkça/örtük olarak işlev nesnelerine eta-genişletme yoluyla dönüştürülür). Yani her yöntem bazı nesnelerin içine yerleştirilir. Bu arada, Scala REPL (ve dahili yorumlayıcının kendisi) sentetik bir nesne yaratır, bu nedenle REPL döngüsünün hemen içinde yöntemleri tanımlayabilirsiniz, ancak insanlar genellikle kodları scalac tarafından derlenmiş olarak derlenmeye hazır hale getirmek için nesneleri kullanırlar. – dk14