Смешение объектно-ориентированного и функционального программирования - PullRequest
29 голосов
/ 19 июня 2009

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

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

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

Ответы [ 12 ]

20 голосов
/ 19 июня 2009
20 голосов
/ 19 июня 2009

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

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

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

12 голосов
/ 19 июня 2009

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

9 голосов
/ 29 января 2010

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

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

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

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

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

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

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

9 голосов
/ 19 июня 2009

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

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

7 голосов
/ 19 июня 2009

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

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

7 голосов
/ 19 июня 2009

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

3 голосов
/ 19 июня 2009

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

3 голосов
/ 19 июня 2009

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

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

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

0 голосов
/ 18 августа 2012

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

...