Я ищу не просто ответ, а более подробное его объяснение.
С левой стороны от = вы используете sum
как функцию, применяемую кx
.Компилятор не знает тип x
, поэтому компилятор использует переменную типа a
для обозначения «типа x
».На этом этапе компилятор также не знает тип результата функции sum
, поэтому он выбирает другую переменную типа, этот тип t
, для обозначения типа результата.Теперь с левой стороны компилятор считает, что тип x
равен a -> t
(функция принимает a
и возвращает t
).
На правой стороне = youдобавить x
и sum
.В Haskell можно добавлять все виды чисел, но вы можете добавлять два числа, только если они имеют тип одинаковый .Таким образом, здесь компилятор предполагает, что sum
имеет тот же тип, что и x
, а именно тип a
.
Но в Haskell идентификатор имеет один тип - возможно, причудливый сложный тип, но, тем не менее, один тип.Это включает sum
, тип которого должен быть одинаковым с обеих сторон знака `, поэтому компилятор пытается решить уравнение
a = a -> t
Нет значений для a
и t
, которые решают это уравнение. Это просто невозможно сделать.Не существует a
такого, что a
равно функции, которая принимает себя в качестве аргумента.Таким образом, возникает сообщение об ошибке
cannot construct the infinite type: a = a -> t
Даже со всеми объяснениями, это не такое большое сообщение об ошибке, не так ли?
Добро пожаловать в Haskell: -)
PS Возможно, вам понравится "Гелий для изучения Haskell", который дает гораздо более приятные сообщения об ошибках для начинающих.