SORU
22 EKİM 2011, CUMARTESİ


Bazı zorlayıcı bağımlı yöntem türleri için durumlarda kullanmak nedir?

Deneysel bir özellik, eskiden bağımlı yöntem türleri,, şimdi enabled by default in the trunk, ve görünüşe göre bu Scala topluluğu some excitement oluşturmuş gibi görünüyor.

İlk bakıştan sonra, bunun için yararlı olabilecek ne hemen belli değil. Heiko Seeberger bağımlı yöntem türleri basit bir örnek ilan olarak kolayca tür parametreleri ile yeniden olabilir yorum yöntemleri üzerinde görülebilir here,. Oldukça ilgi çekici bir örnek değildi. (Zaten bilinen bir şeyi kaçırıyor olabilirim. Eğer öyleyse beni düzeltin lütfen.)

Ne kullanmak pratik ve yararlı bazı örnekler açıkça alternatifler üzerinde avantajlı nerede olduklarını bağımlı yöntem türleri için dava var mı? İlginç şeyler mümkün değildi onlarla/kolay önce ne yapabilirim? Onlar varolan bir tür Sistem Özellikleri bize ne alabilirsin?

Teşekkürler!


BONUS SORU:Bağımlı yöntem türleri / benzer herhangi bir özellik Haskell, Bunun gibi diğer gelişmiş dillere yazılı tür sistemleri bulunan ilham?

CEVAP
22 EKİM 2011, CUMARTESİ


Daha fazla veya daha az üyesi (örn. birini kullanın iç içe geçmiş) türleri bağımlı yöntem türleri için bir ihtiyaç ortaya çıkmasına neden olabilir. Özellikle, bağımlı yöntemi türleri olmadan klasik kek kalıbı anti-desen-bir olmaya daha yakın olduğuna inanıyorum.

Sorun ne? Scala iç içe türü kapsayan kendi örneğini bağlıdır. Sonuç olarak, bağımlı yöntem türleri yokluğunda, bu örnek dışında onları kullanmaya çalışır sinir bozucu derecede zor olabiliyor. Bu nightmarishly katı ve yeniden oluşturulması zor olan canavarlar içine başlangıçta şık ve çekici görünen tasarımlar açabilirsiniz.

Benim sırasında Advanced Scala training course, verdiğim bir egzersiz ile bunu göstermek istiyorum

trait ResourceManager {
  type Resource <: BasicResource
  trait BasicResource {
    def hash : String
    def duplicates(r : Resource) : Boolean
  }
  def create : Resource

  // Test methods: exercise is to move them outside ResourceManager
  def testHash(r : Resource) = assert(r.hash == "9e47088d")  
  def testDuplicates(r : Resource) = assert(r.duplicates(r))
}

trait FileManager extends ResourceManager {
  type Resource <: File
  trait File extends BasicResource {
    def local : Boolean
  }
  override def create : Resource
}

class NetworkFileManager extends FileManager {
  type Resource = RemoteFile
  class RemoteFile extends File {
    def local = false
    def hash = "9e47088d"
    def duplicates(r : Resource) = (local == r.local) && (hash == r.hash)
  }
  override def create : Resource = new RemoteFile
}

Bu örneği klasik kek kalıbı: biz bir aile soyutlamalar olan yavaş yavaş rafine üzerinden bir hiyerarşi (ResourceManager/Resource olan rafine tarafından FileManager/File hangi sırayla rafine tarafından NetworkFileManager/RemoteFile). Oyuncak bir örnek, ama desen gerçek: Scala derleyicisi boyunca kullanılan ve yaygın Scala Eclipse eklentisi kullanılmıştır.

Burada kullanılan soyut bir örnek

val nfm = new NetworkFileManager
val rf : nfm.Resource = nfm.create
nfm.testHash(rf)
nfm.testDuplicates(rf)

Yol bağımlılık derleyici NetworkFileManager testHash testDuplicates yöntemlerden sadece karşılık gelir, yani hangi argüman ile çağrılabilir garanti anlamına gelir unutmayın. RemoteFiles, kendi başka bir şey değil.

Bu inkar edilemez arzu edilen bir özellik değil, ama farklı bir kaynak dosyası için bu test kodu taşımak istedik sanırım? Bağımlı yöntem türleri ile basit ResourceManager hiyerarşi dışında bu yöntemleri tanımlamak için çok kolay

def testHash4(rm : ResourceManager)(r : rm.Resource) = 
  assert(r.hash == "9e47088d")

def testDuplicates4(rm : ResourceManager)(r : rm.Resource) = 
  assert(r.duplicates(r))

Not bağımlı yöntem türleri burada kullanım: ikinci bağımsız değişken türü (rm.Resource) ilk bağımsız değişken değeri (rm) bağlıdır.

Mümkün bunu yapmak olmadan bağımlı yöntem türleri, ama son derece beceriksiz ve mekanizması oldukça sezgisel olmayan: Öğretmenliği yapmaktayım bu ders için neredeyse iki yıl oldu, ve o zaman, hiç kimse oldu ile çalışan bir çözüm üzerinde düşünülmemiş.

Kendiniz deneyin ...

// Reimplement the testHash and testDuplicates methods outside
// the ResourceManager hierarchy without using dependent method types
def testHash        // TODO ... 
def testDuplicates  // TODO ...

testHash(rf)
testDuplicates(rf)

Kısa bir süre onunla uğraştıktan sonra muhtemelen ben (ya da belki de, bu terimi icat eden hatırlamıyoruz Macİver David) bu Kıyamet Fırını Ara neden keşfedeceksiniz.

Düzenleme:uzlaşma Kıyamet Fırın David Macİver ... ... sikkeleri oldu

Bonus: Scala formunun bağımlı tip genel (ve bağımlı yöntemi türleri olarak bir kısmı) esinlenerek programlama dili Beta ... ortaya çıkan doğal Beta tutarlı yuvalama anlambilim. Bu formda bağımlı tipi olan başka bir hatta hafifçe daha yaygın bir programlama dili bilmiyorum. Dil gibi Coq, Kırmızı biber, kötülüğe doğru yöneldi ve Agda var farklı bir form yazarak bağımlı olan bazı yollar daha genel, ancak önemli ölçüde farklı olarak parça tipi sistemler, aksine Scala, yok kistlerinin alt tiplerinin belirlenmesindeki.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Diogo Oliveira

    Diogo Olivei

    4 HAZİRAN 2006
  • DrePwn

    DrePwn

    22 Temmuz 2011
  • gamingbits

    gamingbits

    2 Mayıs 2006