2013-10-28 27 views
6

GHC, en üst düzeyde işlev imzalarım olmadığına dair uyarıyor. Onlara neden ihtiyacım olduğunu anlamıyorum. Neden üst düzey işlevlerimin Haskell'de imzalara ihtiyacı var?

applyValue :: forall t t1 t2 t3 t4. 
       (t2 -> t) 
       -> (t2 -> t3 -> t4 -> t1) -> t2 -> t3 -> t4 -> (t -> Bool) -> [t1] 

Öyleyse neden rahatsız olur ekleyerek: sağlayarak sorunu onlar (oluşturulan) bunun gibi oldukça sofistike olmasıdır?

kendisi işlevi: makine kontrol edilebilir belgelerin bir formu olarak

applyValue getValueAt stitchAndMove at fabric mark matchAt = 
    if matchAt (getValueAt at) 
    then [stitchAndMove at fabric mark] 
    else [] 
+0

Herhangi bir uzantı etkin mü? –

+0

Bazı kodları görebilir miyiz? – jozefg

+6

Bu, '-Wall' ile derlediğiniz için oluyorsa, '-fno-warn-missing-signatures' kullanabilirsiniz. Onları terketmemek için iyi bir uygulama olarak görülüyor - Daniel Wagner'in bunun nedenleri için cevabını görün. –

cevap

22
  • . Eğer bu türün doğru tipte olduğuna inanıyorsanız, oraya koymak, derleyiciyi, daha sonraki kaçınılmaz refactoring seanslarınız sırasında kendi arayüzünüzü hortumlamadığınızı iki kez kontrol etmesini ister.
  • İnsan tarafından okunabilir belgeler. Gördüğünüz gibi, korkunç bir makine tarafından oluşturulmuş bir tür yazdığınızı fark ettiğinizde, muhtemelen insan tarafından okunabilir hale getirmek için ihtiyacınız olan (tip düzeyinde) soyutlamalar hakkında düşünmenin zamanı gelmiştir.
  • Mezgit balığı için. Haddock yorumları, imzalara değil, imzalara eklenir, bu yüzden bir tür imzayı bırakırsanız, dikkatle elle yazılmış belgeleriniz sessizce göz ardı edilir.
  • Hata iletilerini ve ghci sorgu sonuçlarını iyileştirmek için: tür değişkenlerinin gerçek adlarının önemli olmamasına rağmen, GHC, kullanıcı tarafından sağlandığında adları korumakta zorlanır. (node -> Bool) -> (edge -> Bool) -> (graph -> Bool) gibi bir şey, eşdeğer olsalar bile (t1 -> Bool) -> (t2 -> Bool) -> (t3 -> Bool)'dan çok daha okunabilir olabilir.
+1

Sizin noktanız mantıklı, başka bir hızlı sorum var, imzalı blokları yeniden kullanmanın bir yolu var, f1 uzun ve sofistike bir fonksiyon imzası var, şimdi f2 f1 alır, bu yüzden f2 + ile ilgili herşey f1 oldu. F1 imzasını tanımlarken, f1 imzasını isminin bir kısmına (tip?) Atayarak ve bu isimle ona başvurarak bazı işleri kurtarabilir miyim diye merak ediyorum. Teşekkürler –

+6

@AlekseyBykov Evet, bu 'tür' takma adların yaptığı şeydir. Raporda veya favori öğreticinizde bunları okuyabilirsiniz. –

+1

Belgelere veya hata iletilerine önem vermese bile imzalar bazen gereklidir. Bazen, istediğiniz tipte bir sınıfın ne olduğu belirsizdir ve bu yüzden derlenebilmesi için onu açıkça kısıtlamanız gerekir. – newacct

İlgili konular