tür çıkarımı uygulama


94

Burada statik ve dinamik yazım hakkında bazı ilginç tartışmalar görüyorum. Genelde, derleme türü denetimi, daha iyi belgelenmiş kod vb. Nedeniyle statik yazmayı tercih ederim. Ancak, örneğin Java'nın yaptığı gibi yapılırsa kodu karıştıracaklarını kabul ediyorum.

Bu yüzden, kendime ait işlevsel bir stil dili oluşturmaya başlamak üzereyim ve yazı çıkarımı uygulamak istediğim şeylerden biri. Bunun büyük bir konu olduğunu anlıyorum ve daha önce yapılmamış bir şey yaratmaya çalışmıyorum, sadece temel çıkarım ...

Bana bu konuda yardımcı olacak ne okuyacağıma dair herhangi bir işaret var mı? Tercihen daha teorik kategori teorisi / tip teorisi metinlerinin aksine daha pragmatik / pratik bir şey. Veri yapıları / algoritmaları olan bir uygulama tartışma metni varsa, bu çok hoş olurdu.


1
Kesinlikle aradığım soru, bazı harika cevaplarla!
Paul Hollingsworth

Yanıtlar:


90

Aşağıdaki kaynakları, artan zorluk sırasına göre tür çıkarımını anlamak için yararlı buldum:

  1. Ücretsiz olarak temin edilebilen PLAI kitabının 30. Bölümü (Tip Çıkarımı) , Programlama Dilleri: Uygulama ve Yorumlama , birleşme tabanlı tip çıkarımının taslaklarını çizer.
  2. Türleri soyut değerler olarak yorumlama yaz kursu , Haskell'i metal dil olarak kullanan zarif değerlendiriciler, yazım denetleyicileri, tip yeniden yapılandırıcılar ve çıkarıcılar sunar.
  3. Bölüm 7 (Türleri) kitap EOPL , Programlama Dilleri Essentials .
  4. Bölüm 22 (Tip İmar) kitap TAPL , Türleri ve Programlama Dilleri ve karşılık gelen OCaml uygulamaları Keşif ve fullrecon .
  5. DCPL , Programlama Dillerinde Tasarım Kavramları adlı yeni kitabın 13. Bölümü (Tip Yeniden Yapılandırma) .
  6. Akademik makalelerin seçimi .
  7. Closure derleyicisinin TypeInference , Hindler Milner'ın yaklaştığı dinamik dillere daha uygun olan tür çıkarımına yönelik veri akışı analizi yaklaşımının bir örneğidir.

Bununla birlikte, öğrenmenin en iyi yolu yapmak olduğu için, bir programlama dilleri dersinin ev ödevi ile çalışarak bir oyuncak işlevsel dil için tür çıkarımını uygulamayı şiddetle tavsiye ediyorum.

Her ikiniz de bir günden daha kısa sürede tamamlayabileceğiniz bu iki erişilebilir ödevi ML'de öneririm:

  1. PCF Interpreter ( bir çözüm ) ısınmak için.
  2. Hindley-Milner tipi çıkarım için W algoritmasını uygulamak için PCF Tipi Çıkarım ( bir çözüm ).

Bu ödevler daha gelişmiş bir kurstur:

  1. MiniML'yi Uygulama

  2. Polimorfik, Varoluşsal, Özyinelemeli Türler (PDF)

  3. Çift Yönlü Yazım Denetimi (PDF)

  4. Alt Tipleme ve Nesneler (PDF)


2
Sadece ben miyim, yoksa PLAI tanımı büyük ölçüde yanlış / eksik mi? Ders ona biraz daha fazlasını katıyor, ancak görünüşe göre işe yaraması için yeterli değil.
Rei Miyasaka

Ayrıca PLAI kitabının 2012 versiyonundaki algoritmaya ulaşamadım. Kısıtlama listesinde ikame yoktur. Bunun yerine, PLAI kitabının 2003-7 sürümünde tür çıkarım algoritmasını uyguladım, daha iyi çalışıyor gibi görünüyor ve aynı zamanda let-polimorfizmine göre iyi ölçekleniyor.
heykell

29

Konuyla ilgili literatürün çoğunun çok yoğun olması talihsiz bir durum. Ben de senin yerindeydim. Konuya ilk girişimi Programlama Dilleri: Uygulamalar ve Yorumlama bölümünden aldım.

http://www.plai.org/

Soyut fikri ve hemen açık bulamadığım detayları özetlemeye çalışacağım. İlk olarak, tür çıkarımı, kısıtları oluşturmak ve sonra bunları çözmek olarak düşünülebilir. Kısıtlamalar oluşturmak için sözdizimi ağacında yinelenir ve her düğümde bir veya daha fazla kısıtlama oluşturursunuz. Örneğin, düğüm bir +operatör ise, işlenenler ve sonuçların tümü sayı olmalıdır. Bir işlevi uygulayan bir düğüm, işlevin sonucu ile aynı türe sahiptir ve bu böyle devam eder.

Olmayan bir dil için let, yukarıdaki kısıtlamaları değiştirerek körü körüne çözebilirsiniz. Örneğin:

(if (= 1 2) 
    1 
    2)

burada, if ifadesinin koşulunun Boolean olması gerektiğini ve if ifadesinin türünün, thenve elsecümlelerinin türüyle aynı olduğunu söyleyebiliriz . Bildiğimiz 1ve 2sayı olduğumuz için, ikame ile, ififadenin bir sayı olduğunu biliyoruz .

İşlerin çirkinleştiği ve bir süredir anlayamadığım şey, let'le uğraşmaktır:

(let ((id (lambda (x) x)))
    (id id))

Burada, idilettiğiniz her şeyi döndüren, aksi takdirde kimlik işlevi olarak bilinen bir işleve bağlıyız. Sorun, işlevin parametresinin türünün xher kullanımda farklı olmasıdır id. İkinci idtip bir fonksiyonudur a -> a, aher şey olabilir. İlki tiptedir (a -> a) -> (a -> a). Bu, let-polimorfizmi olarak bilinir. Anahtar, kısıtlamaları belirli bir sırayla çözmektir: önce tanım için kısıtlamaları çözün id. Bu olacak a -> a. Daha sonra türünün yeni, ayrı kopyaları, idher yer için kısıtlamalara dönüştürülebilir, idörneğin a2 -> a2ve a3 -> a3.

Bu, çevrimiçi kaynaklarda kolayca açıklanmadı. W veya M algoritmasından bahsedecekler, ancak kısıtları çözme açısından nasıl çalıştıklarından veya let-polimorfizminden neden bahsetmeyeceklerinden bahsedecekler: bu algoritmaların her biri, kısıtlamaları çözmek için bir sıralama zorlar.

Bu kaynağı, W, M Algoritması ve genel kısıt oluşturma ve çözme kavramını birbirine bağlamak için son derece yararlı buldum. Biraz yoğun, ancak çoğundan daha iyi:

http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf

Diğer kağıtların çoğu da güzel:

http://people.cs.uu.nl/bastiaan/papers.html

Umarım bu biraz karanlık bir dünyayı aydınlatmaya yardımcı olur.


7

İşlevsel diller için Hindley Milner'a ek olarak, dinamik dil için tür çıkarımına yönelik bir başka popüler yaklaşım da abstract interpretation.

Soyut yorumlama fikri, somut değerler ortamı (1, false, closure) yerine, dil için özel bir yorumlayıcı yazmaktır, soyut değerler, aka türler (int, bool, vb.) Üzerinde çalışır. Programı soyut değerler üzerinden yorumladığı için buna soyut yorumlama deniyor.

Pysonar2, Python için soyut yorumlamanın zarif bir uygulamasıdır. Google tarafından Python projelerini analiz etmek için kullanılır. Temel olarak visitor pattern, ilgili AST düğümüne değerlendirme çağrısı göndermek için kullanır . Ziyaretçi işlevi , hangi geçerli düğümün değerlendirileceğini transform kabul eder ve contextgeçerli düğümün türünü döndürür.



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.