Чи надають функції вищого порядку більше функціонального програмування?


13

Я задавав подібне запитання на cstheory.SE .

Відповідно до цієї відповіді на Stackoverflow існує алгоритм, який на не ледачому чистому функціональному мові програмування має складність , тоді як той самий алгоритм в імперативному програмуванні - Ω ( n ) . Додавання лінивості до мови FP зробило б алгоритм Ω ( n ) .Ω(nlogn)Ω(n)Ω(n)

Чи є еквівалентні відносини, що порівнюють мову FP з функціями вищого порядку та без них? Це досі Turing завершено? Якщо це так, чи робить відсутність Вищого порядку на FP мову менш "потужною" чи ефективною?


Яка мова FP?
reinierpost

Функції вищого порядку та ледача оцінка - це не те саме, afaik. Отже, про яке ваше питання?
Рафаель

Відповіді:


11

За допомогою функціональної мови програмування, яка є досить потужною (наприклад, з типами даних для реалізації закриттів ), ви можете усунути всі вищі вищі порядки шляхом перетворення дефункціоналізації . Оскільки цей метод використовується для компіляції такої мови, ви можете обґрунтовано припустити, що це не впливає на продуктивність і що в такому режимі вищий порядок не робить мову менш потужною. Однак це впливає на те, як писати код.

Однак якщо мова недостатньо потужна, то так, вищий порядок дає виразну силу. Розглянемо лямбда-обчислення: без будь-якої функції вищого порядку, він дійсно нічого не може зробити, в основному тому, що основні типи даних (цілі числа, булеві) реалізуються за допомогою функцій.

На закінчення, це дійсно залежить від мови.


Вище моя відповідь. Нижче коментар про звичайне припущення про імперативні мови.

Ω(nlogn)Ω(n)Ω(n)

nO(1)O(logn)O(logm)mmnmn

O(1)


4

Це залежить від того, що ви маєте на увазі під виразністю.

Ось аргумент, що вищого порядку щось додає: для мов першого порядку примітивної рекурсії недостатньо для вираження функції Ackermann . Однак при наявності функцій вищого порядку примітивної рекурсії достатньо:

Ackermann 0=λx.x+1Ackermann (m+1)=Iter (Ackermann m)Iter f 0=f 1Iter f (n+1)=f (Iter f n)

Це визначає функцію Акермана лише за допомогою примітивної рекурсії.

IterIterNkNkIter(NN)(NN)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.