SORU
5 HAZİRAN 2011, Pazar


Scala yüksek kinded türü nedir?

Web üzerinde aşağıdaki bulabilirsiniz:

  1. Yüksek kinded type == type yapıcı?

    class AClass[T]{...} // For example, class List[T]
    

    Bazıları bu yüksek kinded bir tip, öyle diyorum çünkü tanımı ile uyumlu olan türleri içinde özetler.

    Yüksek kinded türleridiğer türleri, alan türleri ve yeni bir tür oluşturmak

    Bu halde de bilinirtip kurucu. (Programming in Scala örneğin,).

  2. == Tip yapıcı bir türü olarak yazın yapıcı aldığı yüksek kinded türü parametre?

    Gazetede Generics of a Higher Kind, okuyabilirsiniz

    ... tür soyut tip tip soyut (yüksek-kinded türleri') ..."

    gösteriyor

    class XClass[M[T]]{...} // or
    
    trait YTrait[N[_]]{...} // e.g. trait Functor[F[_]]
    

    yüksek kinded bir türüdür.

Bu düşünceyle, zor ayırt etmektirtip kurucu,yüksek kinded yazınvetürü türü parametre olarak kurucular alır hangi tür yapıcıbu nedenle soru yukarıda.

CEVAP
21 HAZİRAN 2011, Salı


Bana biraz anlam ayrımı ile atış yaparak bu karışıklık bazı başlangıç telafi etmeme izin ver. Değerini insanlar daha aşina olma eğilimi gibi bu açıklamak seviyeye benzetme kullanmak ister.

Yapıcı tür bağımsız değişkeni için geçerli bir tür, bir tür "inşa" bir tip.

Değer oluşturucu bağımsız değişken için bir değer". oluşturmak için geçerli bir değerdir

Değer kurucular genellikle denir "fonksiyonlar" ya da "yöntem". Bu "kurucular" da dedi ki "çok biçimli" (çünkü onlar için kullanılabilir inşa "şeyler" farklı "şekil") ya da "soyut" (çünkü onlar soyut ne değişir arasında farklı polimorfik örneklemesi).

Soyutlama bağlamında/, birinci dereceden" soyutlama: bir tür üzerinde soyut, ama bu tür kendi içinde soyut bir şey olamaz. bir kez kullanın "tek anlamına gelir polimorfizmi Java 5 jenerik birinci dereceden.

Yukarıdaki emri İlk Yorum soyut özellikleri vardır:

Yapıcı, doğru tür bağımsız değişkeni için geçerli bir tür, bir tür "inşa" uygun bir tip.

Değer oluşturucu uygun değeri bağımsız değişkenler için "" uygun bir değer. oluşturmak için geçerli bir değerdir

Vurgulamak için yok soyutlama dahil (öyle de diyebilirsin bu "zero-order", ama ben görmedim bu kullanılan her yerde) gibi değeri 1 veya türü String, biz genellikle bir şey söyle, bir "doğru" ya da değeri yazın.

Uygun bir değer "hemen" bağımsız değişkenler (onlar üzerinde soyut değil) için bekleyen değil, o anlamda. kullanılabilir Kolayca yazdırabilirsiniz değerleri kontrol olarak (fonksiyon seri hile!) düşünüyorum.

Düzgün bir tipi bir tipi olan sınıflandırır değerleri (değer kurucular dahil), tip kurucular değil sınıflandırmak değerleri (ilk ihtiyacı uygulanacaksa doğru tür bağımsız değişkenleri için verim düzgün yazın). Bir tür oluşturmaya, düzgün bir tip olması gerekli (ama yeterli değil). (Soyut bir sınıf, ya da erişim yok bir sınıf olabilir.)

"Üst düzey" sadece polimorfizmi/soyutlama tekrar kullanmak anlamına gelen Genel bir terimdir. Polimorfik türleri ve değerleri için aynı anlama geliyor. Somut olarak, bir şey üzerinde bir şey üzerinde bu özetler sırası üst seviyeden bir özet. Türleri için, dönem "yüksek kinded" daha genel özel amaçlı bir sürümü "üst düzey".

Böylece, bizim karakterizasyon üst düzey versiyonu olur:

Bir tür kurucu türü değişkenler (uygun tip veya tip kurucular) "" uygun bir tip (kurucu). oluşturmak için uygulanan bir türü.

Değer oluşturucu bağımsız değişken (uygun değerleri veya değer kurucular) "" uygun bir değer (kurucu). oluşturmak için geçerli bir değerdir

Böylece, "üst düzey" sadece "dediğin zaman" anlamına gelir özetleme X", gerçekten demek! Soyutlanmış bitti X kendi kaybetmez "soyut hak": bunu istiyor. soyut olabilir (Bu arada, kullandığım fiil "soyut" burada kötü: bırakmak dışında bir şey değildir temel tanımı için bir değer ya da yazın olması çeşitli/kullanıcı tarafından sağlanan soyutlanması gibi bir tartışma.)

İşte bazı örnekler (e-posta ile Lutz sorularını esinlenerek) uygun, birinci mertebe ve yüksek dereceden değerleri ve türleri:

                   proper    first-order           higher-order

values             10        (x: Int) => x         (f: (Int => Int)) => f(10)
types (classes)    String    List                  Functor
types              String    ({type λ[x] = x})#λ   ({type λ[F[x]] = F[String]})#λ

Kullanılan sınıfları şu şekilde belirlenmiştir:

class String
class List[T]
class Functor[F[_]]

Önlemek için yönlendirme ile sınıfların tanımlanması gerekir bir şekilde ifade anonim tür fonksiyonlar, değil ifade doğrudan, Scala, ama kullanabilirsiniz yapısal türleri olmadan çok fazla cümle Tepegöz (tarzı nedeniyle http://stackoverflow.com/users/160378/retronym afaık):

Anonim tür fonksiyonları destekleyen Scala bazı varsayımsal gelecek sürümünde, bu örneklerden son satıra kısaltmak olabilir:

types (informally) String    [x] => x              [F[x]] => F[String]) // I repeat, this is not valid Scala, and might never be

(Kişisel bir not, hiç bahsetti pişmanım "yüksek kinded türleri", sadece tipler sonuçta! Ne zaman ihtiyacın belirsizliği ortadan kaldırmak için, öneririm şeyler söylediğin gibi "yapıcı parametre tipi", "tip kurucu üyesi", ya da "tür yapıcı alias" vurgulayan konuşmuyorsun, sadece doğru tür.)

ps: karmaşık meseleleri daha da, "polimorfik" belirsiz farklı bir şekilde, bu yana bir polimorfik tür bazen anlamına gelir evrensel bir sayısal tür, gibi Forall T, T => T olan düzgün yazın bu yana sınıflandırır polimorfik değerleri (Scala, bu değer yazılabilir olarak yapısal tip {def apply[T](x: T): T = x})

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Digital Bounds

    Digital Boun

    19 Temmuz 2013
  • PlugResearch

    PlugResearch

    22 Mart 2006
  • Tahir Jahi

    Tahir Jahi

    6 Mart 2006