Ответ 1
Учитывая два значения произвольного типа, Haskell не обязательно знает, как их сравнивать для равенства. ==
определяется только для типов, входящих в класс Eq
.
Например, определение того, являются ли две функции равными, является неразрешимым вообще (я думаю).
Вы можете сравнить два списка, проверив, соответствует ли каждый элемент его соответствующему элементу в другом списке. Однако это имеет смысл только в том случае, если вы можете сравнить элементы для равенства, поэтому вам нужно добавить ограничение:
f :: Eq a => [a] -> Bool