Аккумуляторный завод в Хаскелле

Теперь, в начале моего приключения с программированием, у меня есть некоторые проблемы с пониманием основных концепций. Вот один, связанный с Haskell или, возможно, с общей функциональной парадигмой.

Вот общее изложение проблемы фабрики аккумуляторов с http://rosettacode.org/wiki/Accumulator_factory.

[Напишите функцию, которая]

  • Принимает число n и возвращает функцию (назовем ее g), которая принимает число i и возвращает n, увеличенное на накопление i при каждом вызове функции g(i).

  • Работает для любого числового типа, т.е. может принимать как целые числа, так и числа с плавающей запятой, и возвращает функции, которые могут принимать как целые числа, так и числа с плавающей запятой. (Недостаточно просто преобразовать все входные данные в числа с плавающей запятой. Аккумулятор, который видел только целые числа, должен возвращать целые числа.) (т. Е. Если язык не допускает числовой полиморфизм, вы должны использовать перегрузку или что-то в этом роде)

  • Генерирует функции, которые возвращают сумму всех когда-либо переданных им чисел, а не только самых последних. (Для этого требуется часть состояния для хранения накопленного значения, что, в свою очередь, означает, что чистые функциональные языки не могут использоваться для этой задачи.)

  • Возвращает реальную функцию, то есть то, что вы можете использовать везде, где вы могли бы использовать функцию, которую вы определили обычным способом в тексте вашей программы. (Следуйте соглашениям вашего языка здесь.)

  • Не хранит накопленное значение или возвращаемые функции таким образом, что это может привести к их непреднамеренному изменению другим кодом. (Никаких глобальных переменных или других подобных вещей.)

с, как я понимаю, ключевым моментом является: [...] создание функции, которая [...] Генерирует функции, которые возвращают сумму каждого числа, когда-либо переданного им, а не только самого последнего. (Для этого требуется часть состояния для хранения накопленного значения, что, в свою очередь, означает, что чистые функциональные языки не могут использоваться для этой задачи.)

Мы можем найти решение Haskell на том же веб-сайте, и, кажется, оно делает именно то, о чем говорится в приведенной выше цитате.

Здесь http://rosettacode.org/wiki/Category:Haskell сказано, что Haskell чисто функционально.

Чем же тогда объясняется кажущееся противоречие? А может быть, противоречия нет и мне просто не хватает понимания? Спасибо.


person Community    schedule 22.10.2015    source источник


Ответы (1)


Решение Haskell на самом деле не совсем соответствует правилам задачи. В частности, это нарушает правило, что функция «возвращает реальную функцию, то есть то, что вы можете использовать везде, где вы могли бы использовать функцию, которую вы определили обычным способом в тексте вашей программы». Вместо того, чтобы возвращать реальную функцию, он возвращает ST вычисление, которое производит функцию, которая сама производит больше ST вычислений. В контексте ST "потока состояния" вы можете создавать и использовать изменяемые ссылки (STRef), массивы и векторы. Однако это изменяемое состояние не может «просочиться» за пределы потока состояния и загрязнить чистый код.

person dfeuer    schedule 22.10.2015
comment
Я бы сказал, что правила задачи нарушают определение термина «функция», поэтому Haskell имеет полное право нарушать эти правила. - person leftaroundabout; 22.10.2015
comment
@leftaroundabout, я полностью с вами согласен. - person dfeuer; 22.10.2015