2012-12-30 15 views
9

Biraz Haskell derleyicisi yazıyorum ve mümkün olduğu kadar Haskell 2010'u uygulamak istiyorum. Derleyicim bir modülü ayrıştırabilir, ancak bir programa modülleri tamamlamak önemsiz bir görev gibi görünüyor. Ben zor, ama belki geçerli, Haskell modülleri bazı örnekler oluşur: BuradaUçları çözme Haskell modülü ithalatı ve ihracatı

module F(G.x) where 
    import F as G 
    x = 2 

modül F ihracat G.x ancak G.xF.x aynıdır, bu nedenle modül F ihracat x eğer ve ancak, eğer ihraç x. Bu örnekte

module A(a) where 
    import B(a) 
    a = 2 

module B(a) where 
    import A(a) 

, derleyici B ithal a ilan a = 2 aynı olup olmadığını kontrol etmek zorundadır modülün A ihracatını ancak B ihracatını a eğer ve ancak, A ihracat a çözmek için. modülünü A çözme sırasında

module A(f) where 
    import B(f) 

module B(f) where 
    import A(f) 

, derleyici may've A ihracat f, böylece BA(f) içe ve dışa f ima, B ithal f var olduğunu varsaydık. Tek sorun, herhangi bir yerde tanımlanmış olan f olmamasıdır :). İşte

module A(module X) where 
    import A as X 
    import B as X 
    import C as X 
    a = 2 

module B(module C, C.b) where 
    import C 
    b = 3 

module C(module C) 
    import B as C 
    c = 4 

, module ihracat ihracat listeleri birbirlerine ve kendilerine bağımlı olduklarını neden olmaktadır.

Tüm bu örnekler, Haskell 2010 tarafından tanımlanan şekilde Haskell olarak geçerli olmalıdır.

Haskell modüllerinin doğru ve tamamen nasıl uygulanacağı konusunda bir fikrin olup olmadığını öğrenmek istiyorum.

bir modül sadece (basit) değişken bağlamaları, import s (muhtemelen as veya qualified ile), ve muhtemelen kalifiye değişkenlerin ihracat listesi ve module ... kısaltmalar içerdiğini varsayalım. Her modül
  • bağlantı bağlanma
  • renkli onun bağlanma için her modülde kullanılan her (belki nitelikli) değişken her ihraç değişken ihraç değişkenlerin

    • işlem sonlu listesi: algoritma edebilmek zorundadır
  • cevap

    9

    A Formal Specification for the Haskell 98 Module System ilginizi çekebilir.

    Ayrıca şu anda yayınlanmış olan bir dizi blog gönderisinde de bazı ilginç kenar vakalarını ele alıyorum, bunlardan sadece first one yayınlandı.

    Son olarak, tam olarak bunun üzerinde çalışıyorum - Haskell modüllerini işleyen bir kütüphane. Buna haskell-names denir.

    Hedeflerinize bağlı olarak, onu derleyicinizde kullanabilir, kaynak kodunu okuyabilir veya katkıda bulunabilirsiniz. (Örnekleriniz mükemmel test senaryoları yapacak.)


    Soruna cevap olarak: özyinelemeli modülleri sabit bir nokta hesaplama tarafından işlenir.

    Modül grafiğinde güçlü bir şekilde bağlanmış bir bileşenle başlarsınız. Bu bileşendeki her modül için, hiçbir şey vermediği varsayımıyla başlarsınız. Sonra bu modülleri tekrar gözden geçirin ve yeni bilgilere dayanarak yeni ihracat listelerini hesaplayın. Bu sürecin monotonik olduğunu kanıtlayabilirsiniz - ihracat listesi her büyüdüğünde (veya en azından küçülmez). Er ya da geç büyümeyi durdurur - sonra sabit noktaya ulaştınız.

    Sen (yani topluluk sabit noktalar bilgisayar de çok iyidir) statik analizinden bazı fikirler ödünç alarak bu algoritmayı optimize edebilirsiniz, ama benim paket şu anda naif algoritma (code) uygulamak.

    +0

    Vay, teşekkür ederim, aslında bu sorunu hedefleyen belgeler ve kütüphaneler olduğunu ummamıştım :) –