2013-03-16 11 views
7

sonra imza değişikliği yapar. Neden şu ifadeyi var <code>ghci</code> etrafında oynamak bir ödev

> let f = unlines . map (\(a,b) -> show a ++ " " ++ show b) 
> :t f 
f :: [((),())] -> String 

Bunun nedeni nedir: Ama şimdi bazı isim atamak çalışırsanız, ben orijinal olandan daha spesifik bir imza alabilir?

+1

Ayrıca bkz: [1] (http://stackoverflow.com/questions/7055146), [2] (http://stackoverflow.com/questions/11439163), [3] (http: // stackoverflow. com/questions/9714697), [4] (http://stackoverflow.com/questions/8434808), [5] (http://stackoverflow.com/questions/7799345), [6] (http: // stackoverflow .com/questions/8262020), [7] (http://stackoverflow.com/questions/8655900), [8] (http://stackoverflow.com/questions/11003535). Bunların bir kopyasını işaretlemek için bunlardan hangisinin (eğer varsa) emin değilim. –

cevap

12

genellikle bazı bahsedilen in the other answer olarak varsaymak içerir ki, yazın.

Bunu engellemek ya tanımlarınıza bir tür imza eklemek veya :set -XNoMonomorphismRestriction kullanarak monomorfizm kısıtlamasını devre dışı bırakın. Bunu, it gets disabled by default in GHCi in some future version'a kadar otomatik olarak çalıştırılmak üzere .ghci file numaranıza ekleyebilirsiniz.

+1

Veya eta genişler; yani, f x = unline. map (\ (a, b) -> a ++ "++ ++ show b" değerini göster – luqui

4

Tanımlama kuralları.

GHCi'ye malzeme yazdığınızda, varsayılan türleri uygulamaya çalışır. IIRC, bir Num sınırlamasıyla şeyler için o Fractional için Double seçer ve her şey için onu () seçer, Integer seçer. Bir Haskell kaynak dosyada bunu yazmak ve GHCi içine yüklerseniz

, bu (sanırım) olmaz.

Ben de default Int gibi bir şey başına modül bazında varsaymak kurallarını değiştirmeye söyleyebiliriz. monomorphism restriction bölgesinin şekli x = ... (herhangi bir parametre) tanımları (yani polimorfik olmayan) bir monomorfik verilir için