Haskell: type inference and function composition
function-composition, haskell, type-inference, types
Solution
Why is Haskell inferring such a specific type for the function?
GHCi is using type defaulting, to infer a more specific type from a set of possibles. You can avoid this easily by disabling the monomorphism restriction,
Prelude> :set -XNoMonomorphismRestriction
Prelude> let removeall = filter . (/=)
Prelude> :t removeall
removeall :: (Eq a) => a -> [a] -> [a]
Problem
This question was inspired by this answer to another question, indicating that you can remove every occurrence of an element from a list using a function defined as: ``` removeall = filter . (/=) ``` Working it out with pencil and paper from the types of `filter`, `(/=)` and `(.)`, the function has a type of ``` removeall :: (Eq a) => a -> [a] -> [a] ``` which is exactly what you'd expect based on its contract. However, with GHCi 6.6, I get ``` gchi> :t removeall removeall :: Integer -> [Integer] -> [Integer] ``` unless I specify the type explicitly (in which case it works fine). Why is Haskell inferring such a specific type for the function?