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?

War es hilfreich?

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top