Atama dışındaki zorunlu ifadeler için tür çıkarım


10

Zorunlu diller için tip sistemleri hakkında araştırma makaleleri araştırmamda, yalnızca değiştirilebilir referanslara sahip, ancak bileşik operatörler, döngüler veya koşullu gibi gerçek zorunlu kontrol yapıları olmayan bir dile çözümler buluyorum.

Dolayısıyla, http://rust-lang.org gibi kısmi tür çıkarımlı zorunlu bir dilin nasıl uygulanabileceği açık değildir .

Makaleler, parametrelenmiş tiplerin List of aHindley-Milner tip sisteminin önemsiz bir uzantısı olması gibi parametreli tiplerden bahsetmemektedir - sadece birleşme algoritması genişletilmeli ve geri kalan çıkarım olduğu gibi çalışmalıdır. Bununla birlikte, paradokslar ortaya çıktığı için ödevler önemsiz bir şekilde eklenemez, bu nedenle ML değeri kısıtlaması gibi özel tekniklerin uygulanması gerekir.

Zorunlu döngülere, koşullara, IO ve bileşik ifadelere sahip bir dil için bir tür sistemini tanımlayan herhangi bir makale veya kitap önerebilir misiniz?


4
Kısmen Standart ML'nin bileşik operatörler, döngüler ve koşullara sahip olması nedeniyle sorunuzun kaynağını anladığımdan emin değilim (bir satır örneği:) let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end. Peki bir araştırma sorusu düzeyinde, aradığınız cevap "değer kısıtlaması dahil Caml / SML'de geliştirilen teknikleri uygulayın" mı?
Rob Simmons

Soru "Caml / SML için geliştirilen teknikler hakkında hangi makaleleri öneriyorsunuz?"
nponeccop

Tamam - Bunu anladım ve son cümlemi "ML'de kullanıldığı gibi Hindley-Milner türü çıkarım için erişilebilir bir referans mı arıyorsunuz?" Ve sonra 5 dakikalık düzenleme sınırına ulaştım :-)
Rob Simmons

Yanıtlar:


14

Tür çıkarımına düzgün ve işlevsel bir referans arıyorsanız, Gundry, McBride ve McKinna'nın 2010 " Bağlamda Tür Çıkarımı" için kısmen kısayım , ancak bu mevcut mevcut uygulamalar için iyi bir rehber olmayabilir .

Eğer tanımlarsanız: Ben cevabın parçası olduğunu, değer kısıtlaması ötesinde, gerçekten çok zorluk zorunlu dillere Hindley'nin-Milner tipi çıkarımı adapte olduğunu yoktur düşünüyorum e1; e2için sözdizimsel şeker gibi (fn _ => e2) e1ve tanımlamak while e1 do e2için sözdizimsel şeker gibi whiledo e1 (fn () => e2), nerede whiledobir düzenli özyinelemeli işlev

fun whiledo g f = if g then (f (); whiledo g f) else ();

o zaman tür çıkarımı da dahil olmak üzere her şey iyi çalışır .

Değer kısıtlamasının özel bir teknik olmasına gelince, aşağıdaki hikayeyi seviyorum; Karl Crary'den aldığımdan eminim. Değer kısıtlamasının ML'de yazmanızı engelleyeceği şu kodu göz önünde bulundurun:

let
   val x: 'a option ref = ref NONE
in
   (x := SOME 5; x := SOME "Hello")  
end

Tamamen problemsiz olan aşağıdaki kodla karşılaştırın:

let
   val x: unit -> 'a option ref = fn () => ref NONE
in
   (x () := SOME 5; x () := SOME "Hello")  
end

İkinci örneğin ne yaptığını biliyoruz: içeren iki yeni ref hücresi oluşturur NONE, sonra SOME 5ilkini (an int option ref), sonra SOME "Hello"ikincisini (a string option ref) koyar .

xxα.ref(seçenek(α))xΛα.ref[α](YOK)

Bu, ilk örneğin bir "iyi" davranışının, ikinci örneğin davrandığı gibi davrandığı anlamına gelir - tür düzeyinde lambda'yı iki farklı kez başlatın. İlk kez örnek xoluşturduğumuzda int, x [int]bir referans hücre tutma NONEve sonra değerlendirmek için neden olur SOME 5. Biz örneğini ikinci kez xile stringharfe olacak, x [string]bir (hiç değerlendirmek farklı! ) Referans hücre tutma NONEsonra ve SOME "Hello". Bu davranış "doğru" (tip-güvenli), ama kesinlikle bir programcının beklediği şey bu değildir ve bu yüzden bu beklenmedik davranış türüyle ilgilenen programcılardan kaçınmak için ML'deki değer kısıtlamasına sahibiz.


1
Desugared sürümünüz, e1; e2eşleşmeyen bir parantez ve noktalı virgül içeriyor (tanımlaması gerekiyor). Bunu mu demek istediniz (fn _ => e2) e1?
Tsuyoshi Ito

Sağ-o, Tsuyoshi: sabit.
Rob Simmons

Son paragrafınız temel olarak: (işlevsel) anlambilim ve tür sistemi uyuşmuyor, birinin düzeltilmesi gerekiyor ve ikincisini düzeltmeyi seçiyoruz.
Radu GRIGDaha

Radu: elbette, bu özete katılıyorum.
Rob Simmons

3

Xavier Leroy'un doktora tezi iyi bir başlangıçtır.


1
Tez zorunlu döngüler, şartlar, IO ve bileşik ifadeleri kapsamıyor, değil mi? Sorumun ana nedeni, bu konuları kapsayan makaleler bulamamıştım. Yazma ödevleri ile ilgili makaleler bol miktarda bulunmaktadır.
nponeccop

0

Kendi sorumu necroanswering için özür dilerim, ama söz konusu referans

Standart ML için Bir Teklif , Milner, 1983

Bölüm 6 "Standart Türetilmiş Formlar", zorunlu yapıların desugarizasyonunu oldukça kapsamaktadır. Şimdiye kadar, bulabildiğim bu büyük ölçüde açık dönüşümlerin en erken referansı.

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.