:
является оператором «cons» и создает новый список, заголовок которого является значением слева от оператора, а хвост - значением справа от оператора.Таким образом, 0 : [1, 2, 3]
является списком [0, 1, 2, 3]
.
Проверьте поведение этой функции, оценив f 1 0
следующим образом:
f 1 0 = 0 : f 3 1
т.е. f 1 0
является результатом созданияновый список, состоящий из 0
в заголовке и списка, возвращаемого f 3 1
в качестве хвоста.Аналогично, f 3 1
выглядит следующим образом:
f 3 1 = 1 : f 5 4
т.е. f 3 1
является результатом создания нового списка, состоящего из 1
в заголовке и списка, возвращаемого f 5 4
в качестве хвоста.
Таким образом, функция рекурсивно создает список.Кроме того, он бесконечно хвостовой рекурсивен (поскольку не имеет завершающего условия) и, следовательно, приведет к бесконечно длинному списку.
Что касается начальной строки, f :: Integer -> Integer -> [Integer]
, это означает, что f
функция, которая принимает два целых числа (Integer -> Integer
) и возвращает список целых чисел ([Integer]
).Строго говоря, f
принимает целое число (Integer
) и возвращает другую функцию, которая принимает целое число и возвращает список целых чисел (Integer -> [Integer]
) как результат каррирования функции.С этой концепцией вы познакомитесь, углубившись в изучение языка Haskell и других функциональных языков программирования.