Чи можна весь код представити у вигляді серії операцій «Карта / Фільтр / Скорочення»?


16

Нещодавно я переробляв великі фрагменти коду і замінював їх запитами Linq.

Усунення зміщення мови - Linq - це по суті набір операцій Map / Filter і Reduct, які працюють на послідовності даних.

Це змусило мене задуматися, як далеко я б теоретично змогла це прийняти. Чи зможу я переписати всю кодову базу в серію (або навіть єдину) операцій "Карта / Фільтр" та "Зменшити".

На жаль, мені платять за корисні речі, тому мені не вдалося експериментувати набагато далі, але я не можу придумати жодної структури коду, яка не могла б бути перероблена як така. Кодовий ефект може бути вирішений за допомогою монад. Навіть вихідний результат суттєво відображає адреси пам'яті на екранні адреси.

Чи є щось, що неможливо (теоретично) переписати як запит Linq?


Про дерева дивіться тут: stackoverflow.com/questions/250377/…
blueberryfields

Я завжди вважав, що "зменшити" достатньо, щоб гарантувати завершення Тьюрінга (карта та фільтр можна реалізувати як операції скорочення, ні?) - принаймні, функціональний мовний еквівалент скорочення. Я не знаю достатньо про Linq, щоб бути впевненим у тому, наскільки тісно реалізація йде за функціональною.
blueberryfields

1
Я не знаю, але грубим правилом є те, що все, що хто-небудь навіть вважатиме написанням всього свого коду, виявиться Тюрінгом завершеним. Але наслідком цього є те, що завершення Тьюрінга не є дуже захоплюючим.
psr

1
Я погоджуюсь з psr; Я думаю, що вагома відповідь на це питання повинна відповідати повноті Тьюрінга. Доказ може спробувати здійснити машину Тьюрінга, використовуючи лише ці операції.
Роб

Думаючи, що простоює: Навіть якщо ми допускаємо нісенітницю my_list.map(_ignored => a copy of my_list), схоже, використання простору такої програми обмежене деяким поліномом (залежно від довжини програми). Тоді така мова, безумовно, не могла обчислити проблеми, яких немає в PSPACE. Однак, оскільки багато проблем у PSPACE вважаються нерозв'язними, якщо говорити про більші класи, це може бути не дуже серйозним обмеженням.

Відповіді:


1

Це називається функціональним програмуванням і багато хто вважає основоположним поняттям. ось хороший вступ на Joel On Software . Більш технічна відповідь - ні, наразі невідомий спосіб задавати питання комп’ютеру (чітко визначений спосіб), на який неможливо відповісти через обчислення SKI.


1
Існує набагато більше функціонального програмування, ніж функцій map, filterі reduce(це тричі, якщо ми нехтуємо повнотою та використовуємо практичні мови FP). Насправді вони просто є загальними і, таким чином, загалом корисними, але насправді дуже прості програми функціонального програмування. Оголений мінімальний лямбда-числення може визначати ці функції серед багатьох інших, а не навпаки.

"Ось хороший вступ у Joel On Software" - який вдається збити плутанину Fortran з Basic, тому я б не довіряв цьому іншим фактам.
Quant_dev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.