Почему я не могу написать общую функцию, чтобы проверить, равны ли два списка?

Я изучаю Haskell, и я не понимаю, почему я могу это сделать:

f :: [Int] -> Bool
f l  
    | l==l = True
    | otherwise = False

Но я не могу этого сделать.

f :: [a] -> Bool
f l  
    | l==l = True
    | otherwise = False

Что происходит под капотом?

Ответ 1

Учитывая два значения произвольного типа, Haskell не обязательно знает, как их сравнивать для равенства. == определяется только для типов, входящих в класс Eq.

Например, определение того, являются ли две функции равными, является неразрешимым вообще (я думаю).

Вы можете сравнить два списка, проверив, соответствует ли каждый элемент его соответствующему элементу в другом списке. Однако это имеет смысл только в том случае, если вы можете сравнить элементы для равенства, поэтому вам нужно добавить ограничение:

f :: Eq a => [a] -> Bool