Если быть точным, тип [42, 4, 2] будет
Num a => [a]
Это потому, что целочисленный литерал в Haskell трактуется как имеющий неявный «fromIntegral» перед ним, поэтому реальное выражение - [fromIntegral 42, fromIntegral 4, fromIntegral 2].
"fromIntegral" является частью класса Num и имеет тип
fromIntegral :: (Integral a, Num b) => a -> b
Это говорит о том, что он преобразует экземпляр некоторого интегрального типа (то есть Int или Integer) в произвольный другой числовой тип (Int, Float, Double, Complex ...). Вот почему вы можете сказать что-то вроде «43.2 + 1», не получая ошибку типа.
"length [True]" будет иметь тип Int, потому что "length" имеет тип "[a] -> Int", и предоставляется аргумент (список Bool).
«Фильтр даже» немного сложнее. Начнем с типа «фильтр»:
filter :: (a -> Bool) -> [a] -> [a]
Первый параметр (бит в скобках) сам по себе является функцией, которая принимает элемент списка и возвращает Bool. Помните, что оператор «->» в типах Haskell является ассоциативным справа, поэтому, если вы заключите подразумеваемые скобки, вы увидите, что тип:
filter :: (a -> Bool) -> ([a] -> [a])
Другими словами, если вы дадите ему первый аргумент, вы получите новую функцию, которая ожидает второй аргумент. В этом случае первый аргумент:
even :: (Integral a) => a -> Bool
Это вносит небольшую морщинку: «даже» требует, чтобы его аргумент был целочисленным типом (т. Е. Int или Integer, как указано выше), поэтому это ограничение должно быть распространено на результат. Если бы не было, вы могли бы написать это:
filter even "foo"
Следовательно, ответ:
filter even :: (Integral a) => [a] -> [a]
Вы можете видеть, что ограничение Integral происходит от типа "even", а остальная часть типа - от "filter".