Ürün türleriyle tür çıkarımı


15

Birleştirici bir dil için bir derleyici üzerinde çalışıyorum ve tür çıkarımı desteği eklemek istiyorum. Hindley-Milner'ı anlıyorum, ama tip teorisini öğrenirken öğrendim, bu yüzden onu nasıl uyarlayacağımdan emin değilim. Aşağıdaki sistem sağlam mı ve karar verilebilir mi?

Terim, değişmez bir terim, terimlerin bir bileşimi, bir terimin teklifi veya bir ilkeldir.

e::=x|ee|[e]|

Tüm terimler işlevleri belirtir. İki fonksiyon ve , e_1 \: e_2 = e_2 \ circ e_1 , yani yan yana konum ters kompozisyonu belirtir. Değişmez değerler niladik işlevleri belirtir.e 2 e 1e1e2e1e2=e2e1

Kompozisyon dışındaki terimlerin temel tip kuralları vardır:

x:ι[Lit]Γe:σΓ[e]:α.ασ×α[Quot],α not free in Γ

Birleştirici diller eksik olduğu için özellikle uygulama kuralları yoktur.

Bir tür ya bir değişmez değer, bir tür değişkeni ya da yığınlardan yığınlara bir işlevdir; burada bir yığın sağ iç içe bir demet olarak tanımlanır. Tüm fonksiyonlar “istifin geri kalanı” ile ilgili olarak dolaylı olarak polimorfiktir.

τ::=ι|α|ρρρ::=()|τ×ρσ::=τ|α.σ

Şüpheli görünen ilk şey bu, ama neyin yanlış olduğunu tam olarak bilmiyorum.

Okunabilirliğe yardımcı olmak ve parantezleri kısmak için, yazı düzenlerinde olduğunu varsayacağım . Ayrıca, tek bir değer yerine bir yığını belirten bir değişken için büyük harf kullanacağım.ab=b×(a)

Altı ilkel var. İlk beşi oldukça zararsız. dupen üstteki değeri alır ve iki kopyasını üretir. swapilk iki değerin sırasını değiştirir. popen yüksek değeri atar. quotebir değer alır ve onu döndüren bir teklif (işlev) üretir. applyyığına bir tırnak işareti uygular.

dup::Ab.AbAbbswap::Abc.AbcAcbpop::Ab.AbAquote::Ab.AbA(C.CCb)apply::AB.A(AB)B

Son birleştirici, composeiki teklif almalı ve birleştirme türlerini döndürmelidir, yani . Statik olarak yazılan bitişik Cat dilinde , türü çok basittir.[e1][e2]compose=[e1e2]compose

compose::ABCD.A(BC)(CD)A(BD)

Bununla birlikte, bu tip çok kısıtlayıcıdır: ilk fonksiyonun üretiminin ikincinin tüketimiyle tam olarak eşleşmesini gerektirir . Gerçekte, farklı türleri varsaymanız ve sonra birleştirmeniz gerekir. Ama bu türü nasıl yazardınız?

compose::ABCDE.A(BC)(DE)A

iki tür arasındaki farkı göstermesine izin , türü doğru yazabileceğinizi düşünüyorum .compose

compose::ABCDE.A(BC)(DE)A((DC)B((CD)E))

Bu hala nispeten basittir: ve bircompose fonksiyonunu alır . Onun sonucu tükettiğini tüketimi tepesinde değil ürettiği ve üreten üretilmesi tepesinde tarafından tüketilen değil . Bu sıradan kompozisyon için kural verir.f 2 : D E B f 2 f 1 D f 1f1:BCf2:DEBf2f1Df1f2

Γe1:AB.ABΓe2:CD.CDΓe1e2:((CB)A((BC)D))[Comp]

Ancak, bu varsayımsal aslında herhangi bir şeye karşılık geldiğini bilmiyorum ve yanlış bir dönüş yaptığımı düşünüyorum. Tupleların basit bir farkı olabilir mi?

A.()A=()A.A()=AABCD.ABCD=BD iff A=Cotherwise=undefined

Bu konuda görmediğim korkunç bir şekilde kırık bir şey mi var yoksa doğru iz gibi bir şey mi yapıyorum? (Muhtemelen bu şeylerin bazılarını yanlış bir şekilde ölçtüm ve bu alandaki düzeltmeleri de takdir ediyorum.)


Dilbilginizde değişkenleri nasıl kullanıyorsunuz? Bu soru, ihtiyaç duyduğunuz "alt türü" ele almanıza yardımcı olmalıdır.
jmad

1
@jmad: Soruyu anladığımdan emin değilim. Tür değişkenleri, biçim şemalarını resmi olarak tanımlamak amacıyla vardır ve dilin hiç değişkeni yoktur, sadece [karşılıklı olarak] özyinelemeli tanımlamalar vardır.
Jon Purdy

Yeterince adil. Kuralının (belki bir örnekle) neden composeçok kısıtlayıcı olduğunu söyleyebilir misiniz ? Bunun böyle iyi olduğu izlenimine kapıldım. (örn. kısıtlaması , λ hesabında olduğu gibi uygulama için birleştirme ile ele alınabilir)C=D
jmad

@jmad: Tabii. Düşünün twiceolarak tanımlanan dup compose applybir tırnak alır ve iki kez uygulandığı. [1 +] twicegayet iyi: türünde iki işlev oluşturuyorsunuz . Ama öyle değil: eğer A b .ιι[pop] twice , sorun şu ki A Abirb.f1,f2:birbbir , ifadesi bile geçerli olması ve tipi olması gerektiğini olsa izin verilmeyen böyleceA b .birbirb . Çözüm elbette niteleyiciyi doğru yere koymaktır, ancak esas olarakdairesel bir tanım olmadantürünü nasıl yazacağımı merak ediyorum. birb.birbbbircompose
Jon Purdy

Yanıtlar:


9

Aşağıdaki seviye-2 tipi yeterince genel görünüyor. Soruda önerilen tipten çok daha polimorfiktir. Burada değişken, çoklu argüman işlevlerini yakalayan bitişik yığın yığınları üzerinde nicel olarak bulunur.

oluşturma:birBCδ.δ (α.α birαB) (β.β BβC)δ (γ.γ birγC)

Yunan harfleri, yalnızca netlik sağlamak için yığın yığını değişkenleri için kullanılır.

Yığındaki ilk öğenin çıkış yığınının ikinci öğenin giriş yığıyla aynı olması gerektiği kısıtlamaları ifade eder. Aslında iki argüman için değişkenini uygun şekilde somutlaştırmak , soruda önerdiğiniz gibi yeni bir işlem tanımlamaktan ziyade kısıtlamaların düzgün çalışmasını sağlamanın yoludur.B

Tip kontrol sıralaması-2 türleri genel olarak kararsızdır, inanıyorum, ancak pratikte iyi sonuçlar veren (Haskell için) bazı çalışmalar yapılmıştır:

  • Simon L. Peyton Jones, Dimitrios Vytiniotis, Stephanie Weirich, Mark Shields: Rasgele rütbe türleri için pratik tür çıkarım. J. Funct. Programı. 17 (1): 1-82 (2007)

Kompozisyon için tip kuralı basitçe:

Γe1:α.α birα BΓe1:α.α Bα CΓe1 e2:α.α birα C

Tip sisteminin genel olarak çalışmasını sağlamak için aşağıdaki uzmanlık kuralına ihtiyacınız vardır:

Γe:α.α birα BΓe:α.C birα C B

Teşekkürler, bu çok yardımcı oldu. Bu tür, tek bir bağımsız değişkenin işlevleri için doğrudur, ancak birden fazla bağımsız değişkeni desteklemez. Örneğin, ι ιdup + türüne sahip olmalıdır, çünkü ι türüne sahiptirιι+ιιι

1
Yığın türleri yığın parçalarına göre nicelendirilir, bu nedenle iki bağımsız değişken işleviyle ilgili bir sorun yoktur. dup +Yukarıda tanımladığınız gibi oluşturmayı kullanmadığı için bunun nasıl geçerli olduğundan emin değilim .
Dave Clarke

Ee, demek istedim [dup] [+] compose. Ama okudumαBBxαB=ιxι(ιxι)xαι×(ι×α)

Yığımı yanlış yönde yapıyor olabilirim. Yığını oluşturan çiftler programlama dilinde görünmediği sürece yuvalamanın önemli olduğunu düşünmüyorum. (Cevabımı güncellemeyi planlıyorum, ancak önce biraz araştırma yapmalıyım.)
Dave Clarke

Evet, yuvalama hemen hemen bir uygulama detayıdır.
Jon Purdy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.