2012-02-10 9 views
7

Haskell'de büyüyen bir kod tabanı yazıyor. Benim sorunum, GHCI'nin ne olması gerektiğini söylediklerine dayanarak fonksiyonlara tip imzaları ekledim.Haskell'in Güçlü Yazma Esnekliğini Nasıl Sağlarım?

Sorun şu ki, bir kodu değiştirdiğimde, kodum herşeyi değiştirir değiştirmez, tüm yerimi kırıyor ve tüm sorunları izleyerek tüketiyorum.

Ghci'ye bir modül yüklenerek türetilen türler çok mu özel? Güçlü bir yazmanın gücünü esneklikten yararlanmak için imzalarımda hangi tür veya tür sınıflarının kullanılacağına nasıl karar verebilirim? (yani, küçük değişiklikler yapmak için bir saat harcamıyor musunuz?).

+4

Bu biraz garip görünüyor. Tam olarak ne yapıyorsun, tüm kodu bozuyor? Türlerini sürekli mi değiştiriyorsun? Genellikle biri, bir süre sonra (ya da başlangıçta) kendi türleri için bir tasarım üzerinde kendini düzeltirdi ve işin çoğu, kodun geri kalanı üzerinde olurdu (uygun bir şekilde yazılmış bir Haskell'de inanılmaz derecede bağımsız olması gerekir). Ayrıca, türüne kurucular ekliyorsanız, bu tür kodları işleyen kodun ve derleyicinin potansiyel sorunları işaret etmede yardımcı olması şaşırtıcı değildir, ancak jenerik kodun kodu kırmayacaksa yardımcı olabilir. .. – Jedai

+5

Belki de bazı eşanlamlı kelimeler veya tür tanımlamaları yapmanız gerekir, bu nedenle değişiklikleriniz bir noktaya yerelleştirilebilir mi? – augustss

+2

Neyi başarmaya çalıştıklarına dair bir örnek verebilir misiniz ve nasıl davranmasını beklersiniz? – ondra

cevap

7

Sorun şu ki, bir kodu değiştirdiğimde kodum her yerde değişiyor ve tüm sorunları izleyerek tüketiliyor.

Bu

aslında Yesod'da bir özelliği (a Haskell web framework) olarak bildirilir. Aşağıdaki yönlendirme şartname belirttiniz varsayalım:

/blog/#String   BlogR GET 

Ve ben En kısa zamanda yolları bu değişikliği yaparken

/blog/#Date/#String BlogR GET 

olarak değiştirmek istediğinize karar, derleyici beni her yerde söyleyecektir Kodumu kırdım. getBlogR işlevini güncellemeye zorlanacağım - giriş tipini değiştirerek Date kabul eder. Şablonlarımda güvenli tip URL'ler kullandığım herhangi bir yeri güncellemeye zorlanacağım. Bu, @{BlogR (slug p)} ->@{BlogR (date p) (slug p)} gibi bir şeye benziyordu. tipi denetleyicisi yaptığınız değişikliklerin getirdiği sorunları bulmak için yardımcı çünkü

Bu, bir İyidir kabul edilir. ( )

ghci> let shew = show 
ghci> :t shew 
shew ::() -> String 
ghci> :t show 
show :: Show a => a -> String 

Bazen ghci'nin can sıkıcı varsayılanları seçtiği doğrudur. Bununla birlikte, bu, hafifletilebilir.

ghci> :set -XNoMonomorphismRestriction 
ghci> let shew = show 
ghci> :t shew 
shew :: Show a => a -> String 

bir fonksiyonun tipi başlayanlar için harika keşfetmeye GHCi kullanırken, ben GHCi üzerinde güvenerek tavsiye etmem. Tip imzalarının ne anlama geldiğini ve bunları nasıl keşfedeceğinizi öğrenin. Aslında, önce sahip olmayı düşündüğü tip imzasını yazarak bir işlev yazmaya başlayın. Bu beceriyi öğrenmek için sadece küçük bir zaman harcaması gerekir ve Haskell'in tip sistemini kendi avantajınıza göre kullanabilmeniz harika bir nimettir.

+1

Tüm bunları söyledikten sonra, sorunun gerçek cevabı muhtemelen augustss'un önerdiği şeydir: kodunuzu temizlemek için eş anlamlılar ve tip tanımları yazın. –

+0

Harika! Benim problemim, tip sisteminin o kadar karmaşık ki, yeni başlayanlar için imzayı en iyi şekilde tahmin ediyorum ve sadece ghci'yi soracağım. (Benim şu andaki sorunlar numara tipleriyle birlikte). – Toymakerii

+0

Daha iyi bir jenerik versiyonun ne olabileceği ile kodlanmış tanımlarımı karşılaştırmak için GHCI ya da bir bastırma programını anlatmanın bir yolu var mı? – Toymakerii