SORU
3 Mart 2009, Salı


Kullanım Haskell devlet kodu bir koku monad?

Ben dönem "koku" ama ben bir şey daha doğru. düşünemiyorum kod nefret ediyorum

Yüksek seviyeli bir dil tasarımı & inşaat derleyici, dil tasarımı ve işlevsel programlama hakkında bilgi edinmek için boş vaktimde (derleyici Haskell ile yazılmış olması) Whitespace derleyici ediyorum.

Sırasında derleyici kod oluşturma aşamasında, korumak için var ""-ish veri olarak çapraz sözdizimi ağacı. devlet Örneğin, ne zaman derleme akış kontrol deyimleri ihtiyacım var oluşturmak için benzersiz bir isim etiketleri atlamak için (etiketleri oluşturulan bir karşı böyle geçti, güncelleme, ve geri döndü, ve eski değeri sayaç gerekir asla tekrar kullanılabilir). Başka bir örnek satırı sözdizimi ağacı hazır bilgi dizesi, kalıcı bir yığın değişkenleri (Boşluk, dizeleri en iyi yığında saklanır) dönüştürülmesi için gereken rastladım. Şu anda devlet monad tüm kod oluşturma modülü bu başa sarma değilim.

Bana öyle dendi yazılı bir derleyici bir sorun uygundur işlevsel paradigma, ama buluyorum ben bu tasarımı aynı şekilde yapardım tasarım C (Eğer gerçekten yazmak C herhangi bir dilde bile Haskell w/ devlet monadlar).

Haskell sözdizimi C Haskell (daha doğrusu, fonksiyonel paradigmada) - değil düşünmeyi öğrenmek istiyorum. Gerçekten ortadan kaldırmak için denemek/durum monad kullanımını en aza indirmek gerekir, ya da bir meşru işlevseldir ""? tasarım desen

CEVAP
4 Mart 2009, ÇARŞAMBA


Haskell birden fazla Derleyiciler yazdım, ve devlet bir monad birçok derleyici sorunları makul bir çözüm. Ama soyut---don tutmak istediğiniz bir monad kullanıyorsun çok belli olsun.

İşte Glasgow Haskell Derleyicisi bir örnek yaptım (kideğilkontrol akış grafikleri yaparız nereye yazmak, sadece birkaç kenarlarında çalışma),. İşte grafikler yapmak için temel yolu vardır:

empyGraph    :: Graph
mkLabel      :: Label -> Graph
mkAssignment :: Assignment -> Graph  -- modify a register or memory
mkTransfer   :: ControlTransfer -> Graph   -- any control transfer
(<*>)        :: Graph -> Graph -> Graph

Ama keşfettiğin gibi, benzersiz bir etiket sağlamak sıkıcı en iyisi de bu işlevleri sağlar:

withFreshLabel :: (Label -> Graph) -> Graph
mkIfThenElse :: (Label -> Label -> Graph) -- branch condition
             -> Graph   -- code in the 'then' branch
             -> Graph   -- code in the 'else' branch 
             -> Graph   -- resulting if-then-else construct

Graph her şey soyut bir tür çevirmen sadece neşeyle bir şey monadic oluyor farkında olmadan tamamen işlevsel bir şekilde grafikler oluşturur. Sonra, ne zaman grafiğin sonunda inşa edilmiş, sipariş sırası içine bir Cebir türü edebiliriz kodu oluştur, ver bir kaynağı benzersiz etiketleri, çalışma durumu monad, ve dışarı çıkartın veri yapısı.

Devlet monad altında gizlidir; istemci maruz olmasa da, Graph tanımı böyle bir şey

type Graph = RealGraph -> [Label] -> (RealGraph, [Label])

ya da biraz daha doğru

type Graph = RealGraph -> State [Label] RealGraph
  -- a Graph is a monadic function from a successor RealGraph to a new RealGraph

Devlet monad soyutlama katmanı arkasında gizli olan, pis kokulu değil!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BrandonHarrisWalker

    BrandonHarri

    27 Kasım 2006
  • ThePhestor

    ThePhestor

    22 Mart 2011
  • tychoadragmire

    tychoadragmi

    20 Mart 2006