Було б нормально, якби я вирішив написати всю свою Рубі так, ніби це був Haskell?


10

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

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

Конструктивне керівництво вітається ...


13
Чому б тоді просто не написати в Haskell?

1
Я писав би в Haskell один, але Рубі не так вже й погано, щоб заслуговувати на те, щоб її викинути повністю. Мені подобається те, що я можу використовувати його під час написання сценаріїв, і для багатьох швидких експериментів я люблю рубати разом, коли вивчаю речі AI. Але, ймовірно, також тому, що я щойно почав вивчати Haskell, може згодом дотримуватися ваших порад :-)
— nemesisfixx

2
Я не розумію, чому ви просите дозволу Stack Overflow. Якщо ви пишете код, який збираєтеся поділитися з іншими в команді, вам все одно доведеться узгоджувати стилі кодування. Інакше, що це має значення?
— Майк Даніелс

Чому я прошу ТАК? тому що я поважаю чесну думку досвідчених хакерів та програмістів. Використання чистофункціонального підходу до програмування може мати переваги, якими досвідчені розуми зможуть поділитися зі мною (та іншими, як я).
— nemesisfixx

Зважаючи на те, що є об'єктивні причини "ні", це законне питання.
— Ендрю Грімм

Відповіді:


16

Я робив це з пітоном. Я вважаю, що писати в спадково чистому функціональному стилі мовою, яка не була призначена для цього, громіздко . Наприклад, порівняйте два визначення in_order :

def in_order(xs):
    for i in range(1,len(xs)):
        if xs[i] > xs[i+1]:
            return False
    return True

inOrder :: (Ord a) => [a] -> Bool
inOrder xs = and $ zipWith (<=) xs (tail xs)

Запис in_orderшляху Haskell в python буде одночасно багатослівним (оскільки python не дуже добре підтримує необхідні ідіоми) і повільним (лінійний простір замість постійного простору Haskell через лінь).

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

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


Якось ваш опис змусив мене думати про паскаль.
— rasjani

@rasjani, о? Будь-яка причина чому?

Я не знаю, можливо, його нерозуміння англійською мовою добре чи те, що ви описали, що підходить як (я принаймні) речі, де влаштовано / структурують у паскальних одиницях. Просто такий собі розумовий зв’язок, можливо, не буде реального зв’язку з-за першого варіанту;)
— rasjani

1
Заява "лінійний простір замість постійного простору Хаскелла через лінь" не є точним. Лінь все ще передбачає лінійний порядок. Однак я розумію вашу думку.

3
@aromero, я не розумію твого. Яке відношення має до цього? Постійний простір походить від сміття Haskell, що збирає голови списку порівнянь після andїх споживання; вона буде вести себе так само, як і петля. Тоді як список порівнянь python повинен бути сформований у повному обсязі, перш ніж аналог andпобачить будь-яке з них (якщо ви не використовуєте генератори ..., напевно, це є можливою).

7

Ви можете писати Ruby-код у функціональному стилі так, ніби це схема, а не Haskell. Щоб записати це так, як якщо б це був Haskell, знадобиться система типу Haskell, а також всеохоплююча лінива оцінка.


1

Я знайшов розуміння функціонального програмування, і особливо Haskell, щоб бути корисним мені в певних ситуаціях, з якими я стикався в Ruby. Але чим більше я вчуся Haskell, тим більше я усвідомлюю, наскільки Рубі від того, що коли-небудь може бути схожим на Haskell.

Ситуація з завантаженням модуля / коду є однозначною. У поточного перекладача не ввімкнено оптимізацію хвостових викликів, тому ви не можете використовувати рекурсію, як у Haskell. І як тільки ви потрапите в Monads, насправді немає порівняння рівнів абстракції, яких ви можете досягти в Haskell vs. Ruby.

Якщо вас цікавить, я розміщував деякий код порівняння Ruby / Haskell на gist.github.com, коли я навчався.

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


В одному з моїх тестів Smalltalk: self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g]). Зовсім немає причин, чому ви не можете свідомо використовувати монади, на відміну від їх використання, навіть не знаючи, що ви їх використовуєте (як списки).
— Френк Ширар

0

Я б сказав «так». Про що (я думаю) ви говорите - це вплив функціонального програмування на рубіновій мові. Функціональна парадигма має кілька дійсно приємних концепцій, які компліментують або перетинаються з об'єктно-орієнтованими (зокрема, відсутність побічних ефектів).

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


0

Це залежить від того, чи будете ви співпрацювати з іншими. Якщо ви працюєте над кодом самостійно, використовуйте будь-який стиль, з яким ви відчуваєте себе найбільш комфортно. Однак, якщо ви працюєте з іншими програмістами Ruby, вони можуть не використовуватися в суто функціональному стилі програмування і, таким чином, плутати ваш код. Знову ж таки, якщо ваші співробітники також є програмістами Haskell, які перейшли на Ruby, у вас може не виникнути цієї проблеми.

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