Ich studiere Haskell seit einiger Zeit, also bin ich ein Neuling.Haskell polymorphe Anrufe ohne vollständigen Typ Wissen
Der folgende Code ist sehr leicht verständlich:
purStrLn $ show [1]
Hier können wir alle Arten ableiten (mit Standardeinstellungen), und alles funktioniert gut. Aber der folgende Code funktioniert auch:
putStrLn $ show []
auch wenn wir die Liste Typ nicht ableiten kann.
Wenn ich den Code mit GHCI ausführen erhalte ich folgendes:
Prelude> []
[]
Prelude> :t it
it :: [a]
Prelude>
so die Art polymorph zu sein scheint. Aber in diesem Fall würde die Show mit einem teilweise angewandten Typ aufgerufen werden.
Das gleiche Verhalten ist bei anderen Typen üblich, zum Beispiel mit Data.Map.empty, also ist es kein Listen-Feature (oder zumindest scheint es so).
Warum und wie es funktioniert?
'purStrLn $ show [1]' noch auf eine Art auf dem Standard hat, als '[1] :: (Num n) => [n]' – amindfv
Das stimmt, aber in solchen Fällen gibt es Standardwerte. – Totoro
Beachten Sie, dass etwas anderes passiert, wenn die Typvariable unbeschränkt ist, wie z. 'length []', siehe: http://stackoverflow.com/q/7076517. – hammar