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

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Haskell: чистый функционал, в значительной степени нет OO, но вперед, возьмите погружение.: D

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

С#. Удивительная поддержка OO, а также более функциональная (функции первого класса уже, мы увидим, какие улучшения приносит .NET.)

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

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

Javascript: поддерживает первоклассные функции, но не специально для FP, например Scala и F #. Еще немного лучше, чем python IMHO.

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

ИЗМЕНИТЬ: Я понял, что я ошибаюсь, я оставил этот ответ здесь, если кто-то может узнать из моей ошибки - см. комментарии.

Ответ 11

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

Ответ 12

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