Hindley-Milner kurallarını nasıl anlayabilirim?
Hindley-Milner, bir programın (en genel) türünü, açık tür bildirimleri olmadan programın yapımından çıkarabileceğimizi gösteren sıralı hesap (doğal kesinti değil) biçiminde bir dizi kuraldır .
Semboller ve gösterim
İlk olarak, sembolleri açıklayalım ve operatör önceliğini tartışalım
- 𝑥 bir tanımlayıcıdır (gayri resmi olarak bir değişken adı).
- : anlamına gelir bir tür (gayri resmi olarak veya "is-a" örneği).
- sig (sigma), değişken veya işlev olan bir ifadedir.
- böylece 𝑥: 𝜎 okunur " 𝑥 is-a 𝜎 "
- ∈ "öğesinin"
- 𝚪 (Gamma) bir ortamdır.
- ⊦ (onaylama işareti) ileri sürmek anlamına gelir (veya kanıtlar, ancak bağlamsal olarak "ileri sürür " daha iyi okur.)
- ⊦ Γ 𝑥 : σ böylece okunur "Γ, o 𝑥 iddia is-a σ "
- 𝑒 , 𝜎 türünde gerçek bir örnektir (öğe) .
- 𝜏 (tau) bir türdür: temel, değişken ( 𝛼 ), işlevsel 𝜏 → 𝜏 ' veya ürün 𝜏 × 𝜏' (ürün burada kullanılmaz)
- 𝜏 → 𝜏 ' , 𝜏 ve 𝜏' nin potansiyel olarak farklı türler olduğu işlevsel bir türdür .
λ𝑥.𝑒 anlamına λ (lambda) bir bağımsız değişken alır anonim fonksiyonudur 𝑥 , ve bir ifade döner 𝑒 .
izin 𝑥 = 𝑒₀ içinde 𝑒₁ ekspresyonu araçlarının 𝑒₁ , ikame 𝑒₀ yerde 𝑥 görüntülenir.
⊑ , önceki elemanın, ikinci elemanın bir alt türü (gayri resmi olarak alt sınıf) olduğu anlamına gelir.
- 𝛼 bir tür değişkenidir.
- ∀ α.σ (tüm) tip, ∀ bağımsız değişken değişkenleri, bir α dönen σ ifade
- ∉ serbest (𝚪) , dış bağlamda tanımlanan serbest tip değişkenlerinin element öğesi değildir. (Bağlı değişkenler ikame edilebilir.)
Çizginin üzerindeki her şey öncül, aşağıdaki her şey sonuçtur ( Per Martin-Löf )
Öncelik, örnek olarak
Kurallardan daha karmaşık örneklerden bazılarını aldım ve önceliği gösteren gereksiz parantezler ekledim:
- 𝑥: 𝜎 ∈ 𝚪 yazılabilir (𝑥: 𝜎) ∈ 𝚪
𝚪 ⊦ 𝑥 : 𝜎 yazılabilir 𝚪 ⊦ ( 𝑥 : 𝜎 )
𝚪 ⊦ let 𝑥 = 𝑒₀ in 𝑒₁ : 𝜏
eşit olarak 𝚪 ⊦ (( let ( 𝑥 = 𝑒₀ ) in 𝑒₁ ): 𝜏 )
𝚪 ⊦ 𝜆𝑥.𝑒 : 𝜏 → 𝜏 ' eşit olarak 𝚪 ⊦ (( 𝜆𝑥.𝑒 ): ( 𝜏 → 𝜏' ))
Daha sonra, beyan ifadelerini ve diğer önkoşulları ayıran geniş alanlar, bu tür bir önkoşullar kümesini gösterir ve son olarak önceliği sonuçtan ayıran yatay çizgi, öncelik sırasının sonunu getirir.
Kurallar
Bunu takip eden kuralların her biri gevşek bir yeniden ifade ve bir açıklama ile İngilizce yorumlardır.
Değişken
Verilen 𝑥 bir tür 𝜎 (sigma), 𝚪 (Gamma) 'nın bir elementidir, 𝚪
varsayımları 𝑥 bir 𝜎 sonucudur.
Başka bir deyişle, in'de 𝑥 türünün 𝜎 olduğunu biliyoruz çünkü 𝑥 𝜎 türünde.
Bu temel olarak bir totolojidir. Tanımlayıcı adı bir değişken veya işlevdir.
Fonksiyon Uygulaması
Verilen 𝚪 varsayımlar 𝑒₀ fonksiyonel bir tiptir ve 𝚪 varsayımlar 𝑒₁ bir 𝑒₁
sonuç 𝚪 𝑒₀ ila 𝑒₁ fonksiyonunun uygulandığını ileri sürmektedir 𝑒₁ '
Kuralı yeniden ifade etmek için işlev uygulamasının 𝜏 'türünü döndürdüğünü biliyoruz, çünkü işlev 𝜏 → 𝜏' türüne sahiptir ve 𝜏 türünde bir argüman alır.
Bu, bir işlevin bir tür döndürdüğünü bilirsek ve bunu bir bağımsız değişkene uygularsak, sonucun döndürdüğünü bildiğimiz türün bir örneği olacağı anlamına gelir.
İşlev Soyutlama
Erts varsayımları 𝚪 ve 𝑥 verilen bir tür, 𝜏 '
sonuç 𝚪 anonim bir işlev, 𝑥 geri dönen ifade 𝑒, 𝑒 𝜏 → 𝜏 türündedir.
Yine, 𝑥 alan ve bir ifade 𝑒 döndüren bir fonksiyon gördüğümüzde, bunun 𝜏 → 𝜏 'tipinde olduğunu biliyoruz çünkü 𝑥 (a 𝜏) 𝑒' nin 𝜏 'olduğunu söyler.
𝑥 türünün 𝜏 olduğunu ve dolayısıyla 𝑒 ifadesinin 𝜏 'türünde olduğunu bilirsek, 𝑥 ifadesini döndüren 𝑒 işlevi 𝜏 → 𝜏 türündedir.
Değişken bildirimine izin ver
𝚪 türünde 𝚪, of türünde ve 𝚪 ve 𝑥 türlerinde, 𝜏 türünde erts türünü verir
let
türünde in
𝑒₁ sonucunu verir, 𝜏 türünde
𝚪 ekler 𝑥 = 𝑒₀ 𝑒₁
Gevşek 𝑥, 𝑒₀ in 𝑒₁'ye (a 𝜏) bağlıdır, çünkü 𝑒₀ bir 𝜎'dir ve 𝑥, 𝑒₁'nin 𝜏 olduğunu iddia eden bir 𝜎'dir.
Bu, 𝜎 (değişken veya işlev olan) bir 𝑒₀ ifademiz ve bazı ad, 𝑥, ayrıca 𝜎 ve type türündeki bir 𝑒₁ ifademiz varsa, 𝑒₀ yerine 𝑥 yerine göründüğü her yerde 𝑒₁.
Destekleme
𝚪 've 𝜎' türlerinin 𝚪 varsayımları göz önüne alındığında, lude
sonuç 𝚪 türlerinin 𝜎 türünün bir alt türüdür.
𝑒 ifadesi type üst türünde, çünkü 𝑒 ifadesi 𝜎 'alt türünde ve 𝜎 ise parent' üst türünde.
Bir örnek, başka bir türün alt türü olan bir türdeyse, aynı zamanda o süper türün (daha genel tür) bir örneğidir.
genelleme
Verilen 𝚪 varsayımları a bir 𝜎 ve 𝚪, free serbest değişkenlerinin bir elemanı değildir,
𝚪 ekler 𝑒 sonucunu verin, arg ifadesini döndüren tüm argüman ifadeleri için yazın
Bu nedenle, genel olarak, return döndüren tüm argüman değişkenleri (𝛼) için 𝜎 yazılır, çünkü 𝑒 'nin 𝜎 olduğunu ve a' nin serbest bir değişken olmadığını biliyoruz.
Bu, bir programı, kapsayıcı kapsamda (yerel olmayan değişkenler) zaten bağlı olmayan argümanlar için tüm türleri kabul edecek şekilde genelleştirebileceğimiz anlamına gelir. Bu bağlı değişkenler ikame edilebilir.
Hepsini bir araya koy
Belirli varsayımlar (serbest / tanımsız değişkenler, bilinen bir ortam gibi) göz önüne alındığında, aşağıdakilerin türlerini biliyoruz:
- Programlarımızın atom elementleri (Değişken),
- fonksiyonlar tarafından döndürülen değerler (Fonksiyon Uygulaması),
- fonksiyonel yapılar (Fonksiyon Soyutlama),
- izin bağlamaları (Değişken Bildirimlerine İzin Ver),
- üst örnek türleri (Örnekleme) ve
- tüm ifadeler (Genelleme).
Sonuç
Bu kurallar bir araya getirildiğinde, tür ek açıklamalarına gerek kalmadan, iddia edilen bir programın en genel türünü kanıtlamamıza izin verilir.