Yüksek rütbeli polimorfizm son derece yararlıdır. Sistem F'de (aşina olduğunuz yazılan FP dillerinin temel dili), bu, aslında Sistem F'nin programlama yaptığı "yazılan Kilise kodlamaları" nı kabul etmek için gereklidir. Bunlar olmadan, F sistemi tamamen işe yaramaz.
Sistem F'de sayıları
Nat = forall c. (c -> c) -> c -> c
Toplama türü var
plus : Nat -> Nat -> Nat
plus l r = Λ t. λ (s : t -> t). λ (z : t). l s (r s z)
daha yüksek bir sıralama türüdür ( forall c.
bu okların içinde görünür).
Bu başka yerlerde de ortaya çıkıyor. Örneğin, bir hesaplamanın uygun bir devam eden geçiş stili (google "codensity haskell") olduğunu belirtmek istiyorsanız, bunu şu şekilde düzeltirsiniz:
type CPSed A = forall c. (A -> c) -> c
Sistem F'de ıssız bir tip hakkında konuşmak bile daha yüksek rütbeli bir polimorfizm gerektirir
type Void = forall a. a
Bunun uzun ve kısası, saf tip bir sistemde (Sistem F, CoC) bir fonksiyon yazmak, herhangi bir ilginç veriyle uğraşmak istiyorsak daha yüksek dereceli polimorfizm gerektirir.
Özellikle Sistem F'de, bu kodlamaların "imkansız" olması gerekir. Bu, kesinlikle tüm türlerforall a.
üzerinde bir nicelik anlamına gelir . Bu, kritik olarak tanımladığımız türü içerir. Gelen o aslında için duramazdı daha! ML gibi diller bu durum böyle değil, sadece türleri kümesi üzerinden bir tip değişken ölçtüğü için "yüklem" olduğu söylenir ediyoruz olmadan Nicelik (adlandırılır monotypes). Tanımımız gerekli impredicativity biz örneği de çünkü sıra içinde olmak !forall a. a
a
forall a. a
plus
c
l : Nat
Nat
Son olarak, keyfi olarak özyinelemeli türlerde (Sistem F'den farklı olarak) bile hem beklenmedikliği hem de daha yüksek dereceli polimorfizmin olmasını istediğiniz son bir nedenden bahsetmek istiyorum. Haskell'de, "durum iş parçacığı monad" olarak adlandırılan efektler için bir monad var. Fikir, devlet iş parçacığı monad bir şeyleri mutasyona izin verir, ancak sonuçtan değişebilir bir şeye bağlı olmadığından kaçmayı gerektirir. Bu, ST hesaplamalarının gözle görülür derecede saf olduğu anlamına gelir. Bu şartı uygulamak için daha yüksek rütbeli polimorfizm kullanıyoruz
runST :: forall a. (forall s. ST s a) -> a
Burada a
bunun tanıttığımız kapsamın dışında kalmasını sağlayarak, bunun güvenilmeyen iyi biçimlendirilmiş bir tür anlamına s
geldiğini biliyoruz . Biz kullanmak bunu biliyoruz bu nedenle söz konusu devlet dizideki tüm değişken şeyleri parameritize için değişken şeylerin bağımsızdır ve hiçbir şey kapsamını kaçar böylece o hesaplama! Kötü biçimli programları dışlamak için türlerin kullanılmasına harika bir örnek.a
s
s
a
ST
Bu arada, tip teorisi hakkında bilgi edinmek istiyorsanız iyi bir kitaba yatırım yapmanızı öneririm. Bu şeyleri parça ve parça olarak öğrenmek zor. Pierce veya Harper'ın genel olarak PL teorisi (ve tip teorisinin bazı unsurları) hakkındaki kitaplarından birini öneririm. "Türlerde ve programlama dillerinde ileri konular" kitabı da iyi miktarda tür teorisini kapsamaktadır. Son olarak, "Martin Lof'un tür teorisinde programlama" Martin Lof'un özetlediği boyutlu tür teorisine çok iyi bir açıklamadır.
let sdff = (g : (f : <T> (e : T) => void) => void) => {}