Tamam, birer birer gidelim.
Değerler
Değerler, programların değerlendirdiği ve dengelediği somut veri parçalarıdır. Hiçbir şey fantezi, bazı örnekler olabilir
1
true
"fizz buzz foo bar"
Türleri
Bir tür için güzel bir açıklama "bir değer için sınıflandırıcı" dır. Tür, bu değerin çalışma zamanında ne olacağı, ancak derleme zamanında gösterileceği hakkında biraz bilgi içerir.
Örneğin bunu bana söylemek eğer e : bool
derleme sırasında ve bunu anlarsınız e
ya olduğu true
veya false
çalışma zamanı sırasında, başka bir şey! Türler değerleri böyle güzel bir şekilde sınıflandırdığından, bu bilgileri programınızın bazı temel özelliklerini belirlemek için kullanabiliriz.
Örneğin, eklemenizi e
ve e'
ne zaman e : int
ve ne zaman görüyorsanız e' : String
, o zaman bir şeyin biraz kapalı olduğunu biliyorum! Aslında bunu işaretleyebilir ve derleme zamanında "Hey, bu hiç mantıklı değil!"
Daha güçlü bir tip sistemi, daha ilginç değerleri sınıflandıran daha ilginç tiplere izin verir. Örneğin, bazı işlevleri ele alalım
f = fun x -> x
Oldukça açık f : Something -> Something
, ama ne olmalı Something
? Sıkıcı bir tip sistemde, keyfi bir şey belirtmeliyiz Something = int
. Daha esnek bir tip sistemde,
f : forall a. a -> a
Yani "Herhangi için demek ki a
, f
bir harita a
bir etmek a
". Bu f
daha genel olarak kullanalım ve daha ilginç programlar yazalım.
Dahası, derleyici, verdiğimiz sınıflandırıcıyı gerçekten tatmin edecek kontrol edecek, eğer f = fun x -> true
bir hata varsa ve derleyici bunu söyleyecektir!
Bir tldr olarak; tür, bir ifadenin çalışma zamanında olabileceği değerler üzerinde bir derleme süresi kısıtlamasıdır.
Türü Yapıcı
Bazı türler birbiriyle ilişkilidir. Örneğin, tamsayıların listesi dize listesine çok benzer. Bu neredeyse sort
tamsayıların sort
dizeler için nasıl olduğu gibidir . Farklılıkları genelleştirerek ve talep üzerine inşa ederek bu hemen hemen aynı türleri inşa eden bir fabrika hayal edebiliriz. Bir tip yapıcı budur. Türlerden türlere bir işlev gibidir, ancak biraz daha sınırlıdır.
Klasik örnek genel bir listedir. İçin bir tür oluşturucu yalnızca genel tanımdır
data List a = Cons a (List a) | Nil
Şimdi List
bir türü a
o türdeki değerler listesiyle eşleyen bir fonksiyon ! Java topraklarında bunlara belki de "jenerik sınıflar" denir.
Tür Parametreleri
Bir tür parametresi yalnızca bir tür yapıcısına (veya işlevine) aktarılan türdür. Tıpkı değer düzeyinde olduğu gibi , tıpkı bir tür parametresinin nasıl olduğu gibi foo(a)
bir parametreye sahip olduğunu söyleyebiliriz .a
List a
a
Çeşitleri
Türler biraz zor. Temel fikir, bazı türlerin benzer olmasıdır. Örneğin, tüm ilkel türleri java var int
, char
, float
... hangi tüm uslu onlar aynı "türü" var sanki. Dışında, türlerin sınıflandırıcılarından söz ederken, sınıflandırıcı türlerini adlandırırız. Yani int : Prim
, String : Box
, List : Boxed -> Boxed
.
Bu sistem, tıpkı türlerin değerleri nasıl yönettiği gibi, ne tür türleri kullanabileceğimiz konusunda güzel somut kurallar verir. Söylemek saçma olurdu
List<List>
veya
List<int>
Java bu yana List
kullanmak için somut bir tür uygulanması gerektiğinden! Onların türlerine bakarsak List : Boxed -> Boxed
ve o zamandan beri Boxed -> Boxed /= Boxed
, yukarıdaki tür bir hatadır!
Çoğu zaman türleri gerçekten düşünmüyoruz ve sadece "sağduyu" olarak ele alıyoruz, ancak meraklı tip sistemleri ile düşünmek önemli bir şey.
Şimdiye kadar söylediğim şeyin küçük bir örneği
value : type : kind : ...
true : bool : Prim : ...
new F() : Foo : Boxed : ...
Wikipedia'dan Daha İyi Okuma
Bu tür bir şeyle ilgileniyorsanız, iyi bir ders kitabı yatırmanızı şiddetle tavsiye ederim. Tip teorisi ve PLT genel olarak oldukça geniştir ve tutarlı bir bilgi tabanı olmadan (veya en azından ben) aylarca hiçbir yere gitmeden dolaşabilirsiniz.
En sevdiğim kitaplardan ikisi
- Türleri ve Programlama Dili - Ben Pierce
- Programlama Dillerinin Pratik Temelleri - Bob Harper
Her ikisi de az önce bahsettiğim şeyleri anlatan mükemmel kitaplar ve çok daha güzel, iyi açıklanmış detaylar.