Перевод примерно с type-checker-ese на английский:
Не удалось найти ожидаемый тип 'a' (a
жесткая переменная)
Это означает, что он ожидал произвольный тип a
, который также используется в другом месте (следовательно, "жесткий"), поэтому он не может просто взять любой старый тип.
против предполагаемого типа 'Tree a'
Это означает, что вместо этого он обнаружил Tree
, содержащий элементы ожидаемого жесткого полиморфного типа. Это, очевидно, не имеет смысла, поэтому жалуется.
'a' связан подписью типа для 'insert' в Main.hs: 11: 10
Это просто говорит о том, что тип ограничен, потому что вы указали его в сигнатуре этого типа.
В первом аргументе «Leaf», а именно «l» В первом
аргумент «Узел», а именно «(Лист l)» В выражении: Узел (Лист l) m (вставить x r)
Это просто говорит вам, на какой конкретный термин он жалуется, с некоторым контекстом.
Итак, чтобы разобраться: переменная l
- это Tree a
, используемая в контексте, который требует только a
. В этом случае l
, очевидно, имеет правильный тип, поэтому ошибка в том, как он используется. Почему средство проверки типов ищет тип a
? Потому что вы применили к нему конструктор данных Tree
. Но подождите, l
уже Tree a
! и вуаля , весы падают с наших глаз, и правда видна.
... который был всего лишь длинным способом объяснить, почему Эдвард Кметт * быстрый ответ является правильным и какие рассуждения можно использовать, чтобы прийти к такому ответу.