SORU
16 Mart 2012, Cuma


Düz eski kistlerinin alt tiplerinin belirlenmesindeki vs İmpredicative türleri

Bir arkadaşım yöneltilen bir görünüşte zararsız Scala dil soru geçen hafta bunu bilmiyordum iyi cevap: olsun işte kolay bir yolu olduğunu ilan koleksiyonu şeyler ait bazı ortak typeclass. Birinci-sınıf kavramı "" Scala, özellikleri ve içerik sınırları (yani implicits) açısından bunu düşünmek zorundayız. içinde typeclass yok elbette

Somut olarak verilen bazı özellik T[_] temsil eden bir typeclass ve türleri A, B C ile ilgili implicits kapsam T[A], T[B] T[C], biz de bir şey bildirmek gibi bir List[T[a] forAll { type a }], içine hangi edebiliriz atmak örnekleri A, B C ile dokunulmazlık. Elbette bu Scala yer almıyor; question last year bir daha derinlemesine bu anlatılır.

Doğal takip soru "nasıl Haskell yapar?" EVET, özellikle DZD tür bir sistem impredicative polymorphism, "Boxy Types" gazetede açıklanan adı uzantısı vardır. Bu sayfa, belirli bir typeclass T yasal olarak 15 ** bir listesini oluşturmak. Bu tür bir bildirim, derleyici bize zamanında listesinde typeclass örnekleri her değer türleri için ilgili muhafaza sağlayan sözlük-geçen büyü biraz.

Şey, "sözlük-geçen sihirli" "durumda fonksiyonun parametre değişkeni." çok benziyor. Scala gibi nesne yönelimli bir dil, kistlerinin alt tiplerinin belirlenmesindeki "Köşeli Tip" yaklaşımı. bu çok daha basit, doğal bir mekanizmadır , ** 16 ** 17 C bizim sürekli genişletmek eğer T, o zaman sadece List[T] ilan ve mutlu olabiliriz. Aynı şekilde, Kilometre notları aşağıda bir yorum, eğer hepsi uzatmak özellikleri T1, T2 T3 sonra kullanabilirim List[T1 with T2 with T3] gibi bir eşdeğer impredicative Haskell [forall a. (T1 a, T2 a, T3 a) => a].

Ancak, ana, iyi bilinen dezavantajı ile kistlerinin alt tiplerinin belirlenmesindeki göre typeclasses sıkı kavrama: benim A, B C türleri var onların T davranış pişmiş. Hadi bu büyük bir anlaşma bozulur ve farz ediyorumolamazkistlerinin alt tiplerinin belirlenmesindeki kullanın. Yani orta yerde Scala olur pezevenkler^H^H^H^H^Himplicit dönüşüm: belirli bazı A => T, B => T C => T örtülü kapsam, ben yine çok mutlu bir şekilde doldurmak List[T] A, B C değerleri...

... İstediğimiz kadar 37**. Eğer örtük dönüştürmeler A => T1, A => T2 A => T3, varsa bile o noktada listesine A bir koyamayız. Bizim örtülü dönüşüm tam anlamıyla ama hiç kimse bunu daha önce gördüm A => T1 with T2 with T3 sağlamak için yeniden yapılandırılması ve sıkı kavrama başka bir form gibi görünüyor.

Tamam, bu yüzden benim sorum son olarak, sanırım, bir arada birkaç soru vardı daha önce sordum burada: "why avoid subtyping?" "advantages of subtyping over typeclasses" ... bazı birleştirici bir teori olduğunu söylüyor impredicative polimorfizmi ve alt polimorfizmi aynı mı? Örtülü dönüşüm sırrı-çocuk sevgi iki şekilde? Ve birileri Scala sınırları içinde birden çok (en son yukarıdaki örnekte olduğu gibi) ifade etmek için iyi, temiz bir desen ifade edebilir?

CEVAP
16 NİSAN 2012, PAZARTESİ


Varoluşsal türleri ile impredicative türleri karıştırıyorsun. İmpredicative tür koymak için izin verirpolimorfikveri yapısı değerleri, keyfi somut olanlar değil. Diğer bir deyişle [forall a. Num a => a] var demektir bir liste her öğe çalışır gibi herhangi bir sayısal tür, bu yüzden yapamazsın koy örneğin Int Double liste türü [forall a. Num a => a], ama sen-ebilmek koymak gibi bir şey 0 :: Num a => a. İmpredicative türleri burada istediğiniz bir şey değildir.

İstediğiniz her öğe bilinmeyen bir sayısal tür olduğunu söylüyor varoluşsal türleri, örneğin [exists a. Num a => a] (gerçek Haskell sözdizimi değil. Haskell bu yazmak, ancak kapsayıcı bir veri türü ile tanıştırmak istiyoruz:

data SomeNumber = forall a. Num a => SomeNumber a

forall 50 *değişim not. Bu tarif ettiğimiz içindirkurucu. Herhangi bir sayısal tür koyabilirizama tür sistemi" oldu. "unutur sonra (Desen eşleştirme ile) geri aldıktan sonra, hepimiz biliyoruz ki bazı sayısal tür. Kaputun altında neler oluyor, SomeNumber türünü içeren tip sınıfı saklayan gizli bir alan sözlük (aka. sarıcı türü ihtiyacımız var bu yüzden taban/örtülü),.

Şimdi rasgele sayı listesi için 53* *türü kullanabiliriz, fakat her sayı, örneğin [SomeNumber (3.14 :: Double), SomeNumber (42 :: Int)] sarmalıyız. Her tür için doğru sözlüğün baktı ve biz her sayı şal noktada gizli alanına otomatik olarak saklanır.

Bu arada varoluşsal türleri ve tip sınıfları içinde bazı açılardan benzer kistlerinin alt tiplerinin belirlenmesindeki beri temel fark arasında tip sınıfları ve ARAYÜZLERİ bu tip sınıflar taban seyahatler ayrı ayrı nesneleri ve varoluşsal tür paketleri nesneleri ve durumda fonksiyonun parametre değişkeni tekrar bir araya.

Ancak, geleneksel kistlerinin alt tiplerinin belirlenmesindeki farklı olarak, aynı türden iki değere sahip bir taban paketleri bu gibi şeyler yazabiliriz bu yüzden onları tek tek eşleştirmek zorunda değilsin.

data TwoNumbers = forall a. Num a => TwoNumbers a a

f :: TwoNumbers -> TwoNumbers
f (TwoNumbers x y) = TwoNumbers (x y) (x*y)

list1 = map f [TwoNumbers (42 :: Int) 7, TwoNumbers (3.14 :: Double) 9]
-- ==> [TwoNumbers (49 :: Int) 294, TwoNumbers (12.14 :: Double) 28.26]

hatta meraklısı şeyler. Biz sarıcı, maç desen bir kere, türü sınıflar ülkesine geri döndük. x 57 *bilmiyoruz, ancak aynı olduklarını biliyoruz ve doğru sözlük onlara sayısal işlemleri gerçekleştirmek için kullanılabilir.

Her şeyden önce benzer şekilde birden çok türü sınıflar ile çalışır. Derleyici sadece her işlem için sarıcı yazın gizli alanlar oluşturur ve biz maç desen onları kapsamı içine tüm getirmek.

data SomeBoundedNumber = forall a. (Bounded a, Num a) => SBN a

g :: SomeBoundedNumber -> SomeBoundedNumber
g (SBN n) = SBN (maxBound - n)

list2 = map g [SBN (42 :: Int32), SBN (42 :: Int64)]
-- ==> [SBN (2147483605 :: Int32), SBN (9223372036854775765 :: Int64)]

Olarak ben çok acemi gelince, Scala, emin değilim ben de yardımıyla son bölümü olan soru, ama umarım bu en azından temizlenmiş bazı karışıklık ve belirli bazı fikirler üzerinde nasıl geçin.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Alexander Johnson

    Alexander Jo

    26 Temmuz 2008
  • Gigawipf

    Gigawipf

    18 ŞUBAT 2010
  • The Amazing Atheist

    The Amazing

    20 Kasım 2006