Рассмотрим следующий фрагмент кода, определяющий функцию foo
, которая принимает список и выполняет с ним некоторые операции (например, сортировку). Я попытался загрузить фрагмент в ghci
:
-- a function which consumes lists and produces lists
foo :: Ord a => [a] -> [a]
foo [] = []
foo (x:xs) = xs
test1 = foo [1, 2, 3] == [2, 3]
test2 = null $ foo []
но возникает следующая ошибка:
No instance for (Ord a0) arising from a use of ‘foo’
The type variable ‘a0’ is ambiguous
Note: there are several potential instances:
instance (Ord a, Ord b) => Ord (Either a b)
-- Defined in ‘Data.Either’
instance forall (k :: BOX) (s :: k). Ord (Data.Proxy.Proxy s)
-- Defined in ‘Data.Proxy’
instance (GHC.Arr.Ix i, Ord e) => Ord (GHC.Arr.Array i e)
-- Defined in ‘GHC.Arr’
...plus 26 others
In the second argument of ‘($)’, namely ‘foo []’
In the expression: null $ foo []
In an equation for ‘test2’: test2 = null $ foo []
Проблема в выражении test2 = null $ foo []
. Более того, удаление ограничения Ord a
из определения типа foo
решит проблему. Как ни странно, ввод null $ foo []
в интерактивном режиме (после загрузки определения для foo
) работает правильно и выдает ожидаемое true
.
Мне нужно четкое объяснение такого поведения.