Haskell'de nasıl grafik yapılacağını ve üzerlerinde bazı yerel işlemleri nasıl yapacağımı öğrenmek istiyorum, ancak soru Haskell'e özgü değil ve grafikler yerine iki kat bağlantılı listeleri düşünebiliriz.
Soru: Çift bağlantılı bir liste (veya başka bir çift bağlantılı veya dairesel veri yapısı) ve üzerinde işlem yapılmasını, değiştirilemez veri yapılarını (Haskell, Clojure vb.) Destekleyen ve savunan bir dilde uygulamak için deyimsel veya önerilen bir yol ne olurdu? ? Özellikle, dil tarafından resmi olarak yasaklanmış olan yerinde güncellemeler nasıl kullanılır?
Bazı yerel işlemler iki kez bağlantılı bir listede gerçekleştirilirse (örneğin, bir öğe eklenirse), dilin tembelliklerinden dolayı tüm listeyi hemen kopyalamaya gerek olmadığını kolayca hayal edebilirim. Bununla birlikte, liste iki kez bağlandığından, bir yerde değiştirilirse, eski düğümlerin hiçbiri listenin yeni sürümünde kullanılamaz ve bir şekilde er ya da geç işaretlenmeleri, kopyalanmaları, çöp toplanmaları gerekir. . Açıkçası, bunlar yalnızca listenin güncellenmiş kopyası kullanılacaksa gereksiz işlemlerdir, ancak listenin boyutuyla orantılı bir "ek yük" ekleyeceklerdir.
Bu, bu tür görevler için değiştirilemez verilerin basitçe uygunsuz olduğu ve değişebilir veriler için "yerel" desteği olmayan işlevsel bildirim dillerinin zorunlu olanlar kadar iyi olmadığı anlamına mı geliyor? Veya bazı zor bir çözüm var mı?
PS: Bu konuda internette bazı makaleler ve sunumlar buldum, ancak onları takip etmekte zorlandım, bu sorunun cevabının birden fazla paragraf ve belki de bir diyagram almaması gerektiğini düşünüyorum ... Yani, eğer varsa Bu sorunun "işlevsel" bir çözümü yok, cevap muhtemelen "kullanım C" dir. Bir tane varsa, o zaman ne kadar karmaşık olabilir?
İlgili sorular
Msgstr "Fonksiyonel programlamada veri yapıları" . Verimsiz alternatifler yerine yerinde güncellemeleri kullanma hakkındaki özel sorum burada tartışılmıyor.
"Kalıcı Veri Yapılarının İç Mutasyonu" . Burada vurgu, belirli bir dilde düşük seviyeli uygulama üzerinde dururken, sorum doğru dil seçimi (işlevsel veya başka türlü) ve fonksiyonel dillerdeki olası deyimsel çözümler hakkında.
İlgili alıntılar
Tamamen işlevsel programlama dilleri, birçok algoritmanın çok kısaca ifade edilmesine izin verir, ancak yerinde güncellenebilir durumun çok önemli bir rol oynadığı görülen birkaç algoritma vardır. Bu algoritmalar için, güncellenebilir durumdan yoksun olan tamamen işlevsel diller doğal olarak verimsiz görünmektedir ( [Ponder, McGeer ve Ng, 1988] ).
- John Launchbury ve Simon Peyton Jones, Lazy fonksiyonel devlet konuları (1994), ayrıca John Launchbury ve Simon Peyton Jones, Devlet Haskell (1995). Bu makaleler ST
Haskell'de monadik tip yapıcıyı tanıttı .
DiffArray
. Baktığımızda kaynağın ait diffarray paketin i 91 oluşumlarını bkz unsafePerformIO
. Sorumun cevabı "evet, hayır, değişmez verilerle tamamen işlevsel diller normalde yerinde güncellemelere dayanan algoritmaları uygulamak için uygun değil" gibi görünüyor.
Map
, IntMap
ya da HashMap
bir depolama gibi) ve düğümlerin bağlı düğüm kimlikleri içeren yapmak için. "Bilgisayar bilimindeki tüm problemler başka bir dolaylama seviyesi ile çözülebilir."