Odersky, Spoon ve Venners tarafından Scala 2. Baskısında Programlama bölümüne gidiyorum ve bu örnek, fonksiyonel programlama hakkında doğru olduğunu düşündüğüm şeye karşı çıktığı için bir döngü attı. değişmezlik. Örnekte (ve 18'inci kitaptaki kitapta daha önce), yazarlar, bir nesne üzerindeki işlemlerin, bu işlemler nesnenin durumunu dahili olarak değiştirebilse bile, hala "tamamen işlevsel" olabileceğini iddia etmektedir. Örnek, p.442, Ch. 19 şudur:Scala'da Programlamadan İşlevsel Kuyruk
class Queue[+T] private (
private[this] var leading: List[T],
private[this] var trailing: List[T]
) {
private def mirror() =
if (leading.isEmpty) {
while (!trailing.isEmpty) {
leading = trailing.head :: leading
trailing = trailing.tail
}
}
def head: T = {
mirror()
leading.head
}
def tail: Queue[T] = {
mirror()
new Queue(leading.tail, trailing)
}
def enqueue[U >: T](x: U) =
new Queue[U](leading, x :: trailing)
}
verilen gerekçe kadar uzun yan etkileri müşterilerine görünmez olarak, böyle bir şey işlevsel olarak kabul edilebilir olmasıdır. Sanırım bunun arkasına geçebilirim ... Kesinlikle konuşacağım, bu bir işlevi tanımlar. Ama kuşkusuz (ve JVM bellek modelinin ne olduğu konusunda çok fazla bilgim yok) ama bu kodda bununla ilgili potansiyel problemler yok mu? Örneğin
, iki iş parçacığı şöyle bu kuyrukta, işlemleri çalıştırıyorsanız başlatmak için:
Leading: Nil
Trailing: List(1,2,3,4)
o tek iplik aynada bu noktaya alma kafasını() diyebiliriz bu mümkün değil mi() descheduled edilmeden önce:
private def mirror() =
if (leading.isEmpty) {
while (!trailing.isEmpty) {
leading = trailing.head :: leading
> trailing = trailing.tail
}
}
hangi noktada kuyruk şuna benzer:
Leading: List(1)
Trailing: List(1,2,3,4)
Ve ikinci ipliğin arka() ilk aktif değilken, bu iade edileceği çağırdığında:
Leading: Nil
Trailing: List(1,2,3,4)
Oysa ilk parçacığının başlığı() çağrısı bu bir sonraki kuyruk sonra iade edileceği, bitirmek olsaydı Ben kuşkusuz malzeme ve eşzamanlı programlama gerçekten bunu birçok insan içindir eminim, ben, benim için mindbending olan bu tür büyük değilim
Leading: List(2,3,4)
Trailing: Nil
:() o listede çağrı sadece ne kaçırdığımı merak ediyorum.
Sanırım siz haklısınız. Sanırım birden fazla iş parçacığı tarafından kullanılıyorsa "işlevsel his" in bozulduğunu söyleyebilirdiniz. Fonksiyonel programların sorunsuz olarak eşzamanlı olması gerekiyor mu? Bilmiyorum. – Owen