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.
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 1
Kompozisyon dışındaki terimlerin temel tip kuralları vardır:
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.
Altı ilkel var. İlk beşi oldukça zararsız. dup
en üstteki değeri alır ve iki kopyasını üretir. swap
ilk iki değerin sırasını değiştirir. pop
en yüksek değeri atar. quote
bir değer alır ve onu döndüren bir teklif (işlev) üretir. apply
yığına bir tırnak işareti uygular.
Son birleştirici, compose
iki teklif almalı ve birleştirme türlerini döndürmelidir, yani . Statik olarak yazılan bitişik Cat dilinde , türü çok basittir.compose
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?
iki tür arasındaki farkı göstermesine izin , türü doğru yazabileceğinizi düşünüyorum .compose
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 1
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?
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.)
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)
twice
olarak tanımlanan dup compose apply
bir tırnak alır ve iki kez uygulandığı. [1 +] twice
gayet iyi: türünde iki işlev oluşturuyorsunuz . Ama öyle değil: eğer ∀ A b .[pop] twice
, sorun şu ki A ≠ A , ifadesi bile geçerli olması ve tipi olması gerektiğini olsa izin verilmeyen böylece ∀ A b . . Çözüm elbette niteleyiciyi doğru yere koymaktır, ancak esas olarakdairesel bir tanım olmadantürünü nasıl yazacağımı merak ediyorum. compose