2015-12-09 9 views
6

mam te dwie funkcje:Dlaczego `: type` czasami pokazuje` a` i inne razy `t`?

cleanUp a = Data.List.filter (/=[]) a 

joinByPairs [] = [] 
joinByPairs (x:[]) = (x:[]) 
joinByPairs (x:y:xs) = (x ++ y) : joinByPairs xs 

Kiedy załadować je w ghci i wywołać :type na nich, mam te wyniki:

*Main> :type joinByPairs 
joinByPairs :: [[a]] -> [[a]] 
*Main> :type cleanUp 
cleanUp :: Eq t => [[t]] -> [[t]] 

Jaka jest logika nim pokazując a Vs. t? Nie sądzę, że jest to spowodowane częścią Eq t, ponieważ mam inne funkcje, które wykazują coś w rodzaju otherFunction :: Eq a => [[a]] -> [[a]].

+0

To nie ma znaczenia, prawda? : P –

+0

@BartekBanachewicz Nie, a przynajmniej nie sądzę, ale to mnie buga !!! – cambraca

+2

Niektóre funkcje w 'cleanUp' (może' filter') mają podpis typu zapisany za pomocą zmiennej 'a', podczas gdy niektóre funkcje w' joinByPairs' (może '(++)') mają podpis typu zapisany przy użyciu zmiennej 't '. –

Odpowiedz

8

Dzieje się tak ze względu na sposób wybierania nazw zmiennych typu. Zupełnie nowe zmienne otrzymują t. Zmienne typu, które są nazwane w podpisie typu, zachowują nazwę z podpisem typu. Podczas ujednolicania zmiennych typu GHC woli zachować nazwę pochodzącą z jawnego podpisu typu. Jeśli żadne podwyrażenia nie mają jawnego podpisu typu, nie ma nazw innych niż t, aby ujednolicić z.

+1

Zmienne typu, które są nazwane w sygnaturach typów, nie zawsze zachowują te nazwy w wiadomościach typu dziurkowanych, nawet jeśli są one w zasięgu przy użyciu "ScopedTypeVariables". To jest nieprzyjemne, IMO. – dfeuer

+0

Ah. Rzadko używałem maszynopisu, więc nie wpadłem na to. – Carl

+4

Napisy na klawiaturze są niesamowite, chociaż [nie tak niesamowite] (https://ghc.haskell.org/trac/ghc/ticket/9091), ale powinny być takie (https://ghc.haskell.org/ trac/ghc/ticket/9479). – dfeuer

Powiązane problemy