Було б нормально, якби я вирішив написати всю свою Рубі так, ніби це був 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.