2013-03-16 7 views
7

zabawy w ghci mam następujący wyraz: unlines . map (\(a,b) -> show a ++ " " ++ show b)Dlaczego zmiana podpisu po cesji

Teraz, kiedy to sprawdzić poprzez :t uzyskać:

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

więc dokładnie tak, jak oczekiwano. Ale teraz, jeśli spróbuję przypisać je do jakiejś nazwy, otrzymam bardziej konkretny podpis niż oryginalny:

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

Dlaczego tak się dzieje?

+1

Zobacz także: [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). Szczerze mówiąc nie jestem pewien, który (jeśli w ogóle) z tych, aby zaznaczyć ten duplikat. –

Odpowiedz

12

powodu monomorphism restriction definicje POSTAĆ x = ... (nie ma parametrów) podano monomorficzny (to znaczy nie-polimorficzna) typu, który zwykle obejmuje część zalegających jak wspomniano in the other answer.

Aby temu zapobiec, należy dodać podpis typu do definicji lub wyłączyć ograniczenie monomorfizmu za pomocą :set -XNoMonomorphismRestriction. Możesz dodać to do swojego .ghci file, aby automatycznie uruchamiał się przy starcie do it gets disabled by default in GHCi in some future version.

+1

Lub eta expand; tj. let f x = unlines. map (\ (a, b) -> pokaż a ++ "" ++ pokaż b) $ x' – luqui

4

Reguły domyślne.

Po wpisaniu rzeczy w GHCi próbuje zastosować typy domyślne. IIRC, dla rzeczy z ograniczeniem Num wybiera Integer, dla Fractional wybiera Double, a dla wszystkiego innego wybiera ().

Jeśli napiszesz to w pliku źródłowym Haskella i załadujesz go do GHCi, tak się nie stanie (wierzę).

Myślę, że możesz także powiedzieć coś w stylu default Int, aby zmienić domyślne reguły dla poszczególnych modułów.

Powiązane problemy