У Вікіпедії сказано, що Ruby - це функціональна мова, але я не переконаний. Чому чи чому б ні?
У Вікіпедії сказано, що Ruby - це функціональна мова, але я не переконаний. Чому чи чому б ні?
Відповіді:
Я абсолютно точно думаю, що ви можете використовувати функціональний стиль у Ruby.
Одним з найбільш важливих аспектів, який можна запрограмувати у функціональному стилі, є якщо мова підтримує функції вищого порядку ... що робить Рубі.
Тим не менш, також легко програмувати на Ruby в нефункціональному стилі. Іншим ключовим аспектом функціонального стилю є відсутність стану, а реальні математичні функції, які завжди повертають одне і те ж значення для заданого набору входів. Це можна зробити в Ruby, але це не застосовується в мові, як щось більш суворо функціональне, як Haskell.
Так, так, він підтримує функціональний стиль, але це також дозволить вам програмувати і в нефункціональному стилі.
Is ruby a functional language?
і в прямій відповіді це просте ні. Ruby - це об’єктно-орієнтована мова з деякими функціональними особливостями.
Чи є мова функціональною, чи ні - це неважливо. Функціональне програмування - дипломна робота, яку найкраще пояснили Філіп Уодлер (Суть функціонального програмування) та Джон Хьюз (Чому функціональне програмування має значення).
Значуще запитання: "Наскільки Рубі піддається досягненню тези про функціональне програмування?" Відповідь "дуже погано".
Нещодавно я говорив про це. Ось слайди.
Ruby дійсно підтримує функції вищого рівня (див. Карта масиву #, вводити та вибирати), але все ще є обов’язковою, об’єктно-орієнтованою мовою.
Однією з ключових характеристик функціональної мови є те, що вона уникає мінливого стану. Функціональні мови не мають поняття змінної, як це було б у Ruby, C, Java чи будь-якій іншій імперативній мові.
Ще однією ключовою характеристикою функціональної мови є те, що вона зосереджена на визначенні програми з точки зору "що", а не "як". Під час програмування на мові OO ми пишемо класи та методи, щоб приховати реалізацію ("як") від "what" (ім'я класу / методу), але врешті-решт ці методи все-таки записуються з використанням послідовності операторів. У функціональній мові ви не вказуєте послідовність виконання, навіть на найнижчому рівні.
Я вважаю, що підтримка або можливість програмування мовою у функціональному стилі не є функціональною мовою.
Я навіть можу написати Java - код в функціональному стилі , якщо я хочу образити моїх колег і , і я сам кілька місяців тижні на.
Наявність функціональної мови - це не тільки те, що ви можете зробити, наприклад, функції вищого порядку, першокласні функції та каррі. Йдеться також про те, що ви не можете зробити, як побічні ефекти в чистих функціях.
Це важливо, оскільки це велика частина причини, чому функціональні програми або функціональний код у generel легше міркувати. І коли про код легше міркувати, помилки стають дрібнішими і спливають на концептуальну поверхню, де їх можна виправити, що, в свою чергу, дає менше коду помилок.
Ruby в своїй основі є об’єктно-орієнтованим, тому, хоча він має досить хорошу підтримку функціонального стилю, сам по собі він не є функціональною мовою.
Це все одно моя ненаукова думка.
Редагувати: Оглянувши ретроспективу та враховуючи чудові коментарі, я отримав цю відповідь до цього часу, я думаю, що об’єктно-орієнтоване порівняно з функціональним порівнянням - це яблука та апельсини.
Справжній відмінність полягає в тому, щоб бути непорушним у виконанні чи ні. Функціональні мови мають вираз основною лінгвістичною конструкцією, і порядок виконання часто не визначений або визначений як ледачий. Можливе суворе виконання, але застосовується лише за потреби. Мовою, що не відповідає вимогам, за замовчуванням є строге виконання, і хоча можливе ледаче виконання, це часто буває важко робити, і це може мати непередбачувані результати у багатьох крайових випадках.
Зараз це моя ненаукова думка.
Ruby повинен відповідати наведеним нижче вимогам, щоб бути "Справді" функціональним.
Незмінні значення: після встановлення “змінної” її неможливо змінити. У Ruby це означає, що вам ефективно потрібно обробляти змінні як константи. Мова не повністю підтримується мовою, вам доведеться заморозити кожну змінну вручну.
Відсутність побічних ефектів: при передачі заданого значення функція завжди повинна повертати однаковий результат. Це поєднується з незмінними значеннями; функція ніколи не може приймати значення і змінювати його, оскільки це може спричинити побічний ефект, який є дотичним до повернення результату.
Функції вищого порядку: це функції, які дозволяють функції як аргументи або використовують функції як повернене значення. Це, безперечно, одна з найважливіших особливостей будь-якої функціональної мови.
Каррінг: увімкнений функціями вищого порядку, каррінг - це перетворення функції, яка приймає кілька аргументів, у функцію, яка приймає один аргумент. Це поєднується із частковим застосуванням функції, яке перетворює багатоаргументну функцію у функцію, яка приймає менше аргументів, ніж раніше.
Рекурсія: циклічне виклик функції зсередини. Коли у вас немає доступу до змінних даних, рекурсія використовується для створення та ланцюжка побудови даних. Це пояснюється тим, що цикл не є функціональним поняттям, оскільки він вимагає передачі змінних для збереження стану циклу в даний момент часу.
Ледача оцінка, або відкладена оцінка: затягування обробки значень до моменту, коли це насправді потрібно. Якщо, як приклад, у вас є якийсь код, який створив список чисел Фібоначчі з увімкненим методом лінивого оцінювання, це насправді не буде оброблятися і обчислюватися, поки одне зі значень у результаті не буде потрібно іншою функцією, наприклад, путами.
Пропозиція (Тільки думка)
Мені було б здорово мати якесь визначення, щоб мати mode
директиву для оголошення файлів з функціональною парадигмою,
режим "функціональний"
Ruby - мова багатопарадигм, що підтримує функціональний стиль програмування.
Це залежить від вашого визначення “функціональної мови”. Особисто я думаю, що сам термін є досить проблематичним, якщо його використовувати як абсолютний. Це більше аспектів, як бути “функціональною мовою”, ніж просто мовні особливості, і більшість залежать від того, звідки ви дивитесь. Наприклад, культура, що оточує мову, є досить важливою в цьому плані. Чи заохочує це функціональний стиль? А як щодо доступних бібліотек? Чи заохочують вони вас використовувати їх функціонально?
Наприклад, більшість людей називали б схему функціональною мовою. Але як щодо Common Lisp? Окрім проблеми з кількома / єдиними іменами та гарантованого усунення хвостового виклику (який підтримують також деякі реалізації CL, залежно від налаштувань компілятора), не так багато, що робить Scheme як мову більш придатною для функціонального програмування, ніж Common Lisp, і все ж більшість Lispers не називали б CL функціональною мовою. Чому? Оскільки культура, яка його оточує, сильно залежить від обов’язкових особливостей CL (наприклад, як макрос LOOP, наприклад, на який, напевно, бідкається більшість Schemers).
З іншого боку, програміст C цілком може вважати CL функціональною мовою. Більшість кодів, написаних на будь-якому діалекті Lisp, безумовно, набагато функціональніші за стилем, зрештою, як ваш звичайний блок коду C. Так само, Scheme є дуже необхідною мовою порівняно з Haskell. Тому я не думаю, що коли-небудь може бути чітка відповідь так / ні. Чи називати мову функціонально чи ні, сильно залежить від вашої точки зору.
Я думаю, що Ruby насправді не є багатомовною парадигмою. Мультипарадигма, як правило, використовується людьми, які хочуть позначити свою улюблену мову як щось корисне у багатьох різних сферах.
Я б описав, що Ruby є об'єктно-орієнтованою мовою сценаріїв. Так, функції - це першокласні об’єкти (начебто), але це насправді не робить їх функціональною мовою. IMO, я можу додати.
Рекурсія поширена у функціональному програмуванні. Майже будь-яка мова підтримує рекурсію, але рекурсивні алгоритми часто неефективні, якщо відсутня оптимізація хвостових викликів (TCO).
Функціональні мови програмування здатні оптимізувати рекурсію хвоста і можуть виконувати такий код у постійному просторі. Деякі реалізації Ruby оптимізують рекурсію хвоста, інші ні, але загалом реалізації Ruby не вимагають TCO. Подивіться, чи виконує Ruby оптимізацію виклику хвоста?
Отже, якщо ви пишете якийсь функціональний стиль Ruby і покладаєтесь на TCO певної реалізації, ваш код може бути дуже неефективним в іншому інтерпретаторі Ruby. Думаю, саме тому Ruby не є функціональною мовою (як і Python).
Власне кажучи, немає сенсу описувати мову як «функціональну»; більшість мов здатні до функціонального програмування. Навіть C ++ є.
Функціональний стиль - це більш-менш підмножина імперативних особливостей мови, що підтримується синтаксичним цукром та деякими оптимізаціями компілятора, такими як незмінність та згладжування рекурсії хвоста,
Останнє, безперечно, є незначною технічною специфікою для реалізації та не має нічого спільного з фактичною мовою. Компілятор x64 C # 4.0 виконує оптимізацію рекурсії хвоста, тоді як x86 не робить це з якоїсь дурної причини.
Синтаксичний цукор зазвичай можна в тій чи іншій мірі опрацювати, особливо якщо мова має програмований попередній компілятор (тобто C #define).
Може бути дещо більш значущим запитати: "чи підтримує мова __ імперативне програмування?", А відповідь, наприклад, з Lisp, "ні".
Будь ласка, погляньте на початок книги: "A-Great-Ruby-eBook" . У ньому обговорюється дуже конкретна тема, яку ви задаєте. У Ruby ви можете робити різні типи програмування. Якщо ви хочете програмувати як функціонально, ви можете це зробити. Якщо ви хочете програмувати як імперативно, ви можете це зробити. Це питання визначення, наскільки функціональний Ruby врешті-решт. Перегляньте відповідь користувача camflan.