Смешивание объектно-ориентированного и функционального программирования

StackOverflow https://stackoverflow.com/questions/1015606

Вопрос

Какие существуют языки, которые продвигают как объектно-ориентированное, так и функциональное программирование?Я знаю, что любой язык, поддерживающий первоклассные функции, можно считать функциональным, но я ищу синтаксис, специально предназначенный для обоих стилей кодирования.

Используя такой язык, я представляю, что изолирую все изменения состояния от одной части кода, а остальная часть программы будет чисто функциональной.От одной мысли об этом у меня текут слюнки (небеса отладки!).

До сих пор я обнаружил Скала хотя я только сейчас услышал об этом (и выглядит это потрясающе).Есть ли какие-то серьезные соперники в этой парадигме "смешанного стиля"?

Это было полезно?

Решение

Наиболее известными являются OCaml и F # (который можно смутно описать как OCaml для .NET).

Есть много других языков с множеством парадигм, таких как Оз , но у них есть в основном педагогическая ценность. В отличие от OCaml очень практично. Это почти так же быстро, как C и почти так же красиво, как Haskell:)

Популярные языки сценариев, такие как Python и Ruby, позволяют программировать и в функциональном стиле. Тем не менее, они не предоставляют одно из самых сильных средств, которое "классическое" функциональные языки (а также OCaml) имеют: сопоставление с образцом (не путайте его с регулярным выражением) .

Другие советы

Кроме того, многие скриптовые языки, такие как Python, Ruby, Lua и т.д.обладают этой возможностью, но им не хватает многих приятных функций функциональных языков, таких как алгебраические типы данных и сопоставление с образцом.

Насколько мне известно, OCaml и F # - самые популярные языки, которые смешивают ООП и FP.

Большинство языков, таких как Ruby, смешивают функциональное программирование, но многие люди даже не осознают этого. Я считаю, что такие языки оставляют желать лучшего на синтаксисе и тому подобное.

Haskell : чистый функционал, практически без ОО, но продолжайте, нырните. : D

Scala . Прекрасное сочетание OO и FP может превзойти Java в качестве основного языка в JVM через 10 или 2 года. Мне это нравится, потому что оно переносит функциональное программирование на платформу Java, что является крайне нужно ИМХО.

C # : потрясающая поддержка ОО, а также повышение ее функциональности (уже есть функции первого класса, посмотрим, какие улучшения принесет .net 4)

F # : язык .net Создан специально для работы, в отличие от C #, который изначально был задуман для ООП.

Python : отлично подходит для ОО, но совсем не подходит для FP

Javascript : поддерживает первоклассные функции, но не предназначены специально для FP, таких как Scala и F #. Все еще немного лучше чем питон ИМХО.

Почему вы хотите смешать OO и FP? В качестве ступеньки?

C#.Это обязательное условие, которое может быть удобным, но также обладает множеством функциональных возможностей.Лямбды, итераторы и LINQ - все они функциональны.

Вероятно, пуристам это не очень понравится, но для меня это работает.

JavaScript, Python и Ruby могут быть использованы таким образом, но Scala поднимает ступеньку выше набрав функцию статически и работая под JVM.

Вы действительно задаете не тот вопрос. Ваш вопрос основан на том, что существует различие между "OO" " и «функциональный» программирование. Это различие не интересно или не актуально. На самом деле, согласно «поддерживает первоклассную функцию» критерии, даже Java работает .

Но вы ударили ноготь по голове "чисто функциональным". Это интересный момент. Какие языки предлагают вам ссылочную прозрачность и чистоту? Ну, большинство из них, , если вы очень осторожны. Но не многие из них действительно гарантируют, что ваши функции чисты. Я могу думать только о нескольких языках, которые предлагают вам это.

Одним из них является Haskell . В Haskell вы пишете программы, которые полностью функциональны от начала до конца. Побочные эффекты делегируются структуре данных, называемой IO, а состояние обрабатывается путем передачи его через чистые функции или инкапсуляции в монады. Итак, у вас есть «небо отладки» где только небольшая часть вашего кода взаимодействует с глобальным состоянием, а остальная часть вашей программы является чистой, а чистота обеспечивается языком.

Пока вы не настаиваете на «чистоте», Common Lisp поддерживает все ваши потребности.

Мне интересно, почему вы ищете язык, который специально поощряет смешивание, а не просто делает это с языком, который хорошо работает с функциональным программированием и ОО-программированием? Его можно легко реализовать с помощью Python, Ruby, Perl или аналогичных интерпретируемых языков. Кроме того, ОО-языки на основе С, как правило, смешивают чистый С с ОО-функциями, например, цель C легко может быть написана таким образом, если вы выберете.

РЕДАКТИРОВАТЬ: меня предупредили, что я ошибаюсь, я оставил здесь этот ответ, если кто-то может извлечь уроки из моей ошибки - см. комментарии.

Python, javascript, обычный lisp, ruby, smalltalk, haskell и ocaml с моей головы. Это не совсем экзотическая комбинация.

Руби!В Ruby все является объектом (даже литералы), и он также имеет полную функциональную поддержку программирования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top