Sto studiando Haskell da un po ', quindi sono un principiante.Chiamate polimorfiche Haskell senza una conoscenza completa del tipo
Il seguente codice è facilmente comprensibile:
purStrLn $ show [1]
Qui possiamo dedurre tutti i tipi (con valori di default), e tutto funziona bene. Ma il seguente codice funziona, troppo:
putStrLn $ show []
anche se non siamo in grado di dedurre il tipo di lista.
Se eseguo il codice con ghci ottengo il seguente:
Prelude> []
[]
Prelude> :t it
it :: [a]
Prelude>
modo che il tipo sembra essere polimorfico. Ma in questo caso lo show verrebbe chiamato con un tipo parzialmente applicato.
Lo stesso comportamento è comune con altri tipi, ad esempio con Data.Map.empty, quindi non è una funzionalità di elenco (o almeno sembra così).
Perché e come funziona?
'purStrLn $ spettacolo [1]' deve ancora predefinito a un tipo, come '[1] :: (Num n) => [n]' – amindfv
È vero, ma in casi come questo ci sono dei default. – Totoro
Si noti che qualcos'altro accade quando la variabile di tipo non è vincolata come in es. 'length []', consultare: http://stackoverflow.com/q/7076517. – hammar