Теперь, в начале моего приключения с программированием, у меня есть некоторые проблемы с пониманием основных концепций. Вот один, связанный с Haskell или, возможно, с общей функциональной парадигмой.
Вот общее изложение проблемы фабрики аккумуляторов с http://rosettacode.org/wiki/Accumulator_factory.
[Напишите функцию, которая]
Принимает число n и возвращает функцию (назовем ее g), которая принимает число i и возвращает n, увеличенное на накопление i при каждом вызове функции g(i).
Работает для любого числового типа, т.е. может принимать как целые числа, так и числа с плавающей запятой, и возвращает функции, которые могут принимать как целые числа, так и числа с плавающей запятой. (Недостаточно просто преобразовать все входные данные в числа с плавающей запятой. Аккумулятор, который видел только целые числа, должен возвращать целые числа.) (т. Е. Если язык не допускает числовой полиморфизм, вы должны использовать перегрузку или что-то в этом роде)
Генерирует функции, которые возвращают сумму всех когда-либо переданных им чисел, а не только самых последних. (Для этого требуется часть состояния для хранения накопленного значения, что, в свою очередь, означает, что чистые функциональные языки не могут использоваться для этой задачи.)
Возвращает реальную функцию, то есть то, что вы можете использовать везде, где вы могли бы использовать функцию, которую вы определили обычным способом в тексте вашей программы. (Следуйте соглашениям вашего языка здесь.)
Не хранит накопленное значение или возвращаемые функции таким образом, что это может привести к их непреднамеренному изменению другим кодом. (Никаких глобальных переменных или других подобных вещей.)
с, как я понимаю, ключевым моментом является: [...] создание функции, которая [...] Генерирует функции, которые возвращают сумму каждого числа, когда-либо переданного им, а не только самого последнего. (Для этого требуется часть состояния для хранения накопленного значения, что, в свою очередь, означает, что чистые функциональные языки не могут использоваться для этой задачи.)
Мы можем найти решение Haskell на том же веб-сайте, и, кажется, оно делает именно то, о чем говорится в приведенной выше цитате.
Здесь http://rosettacode.org/wiki/Category:Haskell сказано, что Haskell чисто функционально.
Чем же тогда объясняется кажущееся противоречие? А может быть, противоречия нет и мне просто не хватает понимания? Спасибо.