Haskell: Typinferenz und Funktions Zusammensetzung
-
20-09-2019 - |
Frage
Diese Frage wurde durch diese inspiriert Antwort auf eine andere Frage anzeigt, dass Sie jedes Vorkommen eines Elements aus einer Liste entfernen können eine Funktion definiert werden:
removeall = filter . (/=)
Arbeiten Sie es aus mit Bleistift und Papier aus den Typen von filter
, (/=)
und (.)
, hat die Funktion eine Art
removeall :: (Eq a) => a -> [a] -> [a]
das ist genau das, was Sie basiert auf seinen Vertrag erwarten würde. Doch mit GHCi 6.6, erhalte ich
gchi> :t removeall
removeall :: Integer -> [Integer] -> [Integer]
, wenn ich den Typen explizit angeben (in diesem Fall, es funktioniert). Warum ist Haskell Folgern eine solche speziellen Typ für die Funktion?
Lösung
Warum ist Haskell Folgern solch einen bestimmten Typ für die Funktion?
GHCi verwendet Typ säumige , abzuleiten aus einem Satz von possibles einen spezifischeren Typ. Sie können dies leicht vermeiden, indem das Deaktivieren die Monomorphie Einschränkung ,
Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall
removeall :: (Eq a) => a -> [a] -> [a]
Andere Tipps
Es ist auch erwähnenswert, dass, wenn Sie nicht einen Namen für den Ausdruck zuweisen, typechecker Art zu vermeiden, scheint säumige:
Prelude> :t filter . (/=)
filter . (/=) :: (Eq a) => a -> [a] -> [a]