2015-10-22 2 views
2

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

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

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

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

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

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

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

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

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

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

Здесь http://rosettacode.org/wiki/Category:Haskell Говорят, что Haskell является чисто функциональным.

В чем заключается объяснение очевидного противоречия? Или, может быть, нет противоречия, и мне просто не хватает понимания? Благодарю.

ответ

4

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

+6

Я бы сказал, что правила проблемы нарушают определение термина «функция», поэтому Haskell имеет полное право нарушать эти правила. – leftaroundabout

+1

@leftaroundabout, я полностью согласен с вами. – dfeuer