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

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

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

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

 Rayne19 июн. 2009 г., 00:58
Я не очень люблю языки, которые так смешиваются. Это разрушает смысл для меня. Я изучаю Haskell прямо сейчас, и затем я буду углубляться в Clojure. Мои два любимых языка! : D
 ThomasH09 мая 2011 г., 12:28
+1 Я полностью согласен с идеей выделения изменения состояния для отдельных частей программы и обеспечения его функциональности в другом месте (или наоборот; Кент Бек называет их «математическими микромирами»).
 Kai19 июн. 2009 г., 04:39
Я использовал Clojure, это здорово для бывшего Лиспера! Я могу сделать это напротив вас и затем выучить Хаскель.

Ответы на вопрос(12)

Javascript:OO а такжефункциональная.

 09 дек. 2012 г., 19:02
А использование Coffeescript улучшает функциональность.

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

 19 июн. 2009 г., 08:44
Если вам не нужна статическая проверка типов.
 09 мая 2011 г., 13:57
Возвращаясь к этому вопросу спустя почти 2 года: статическая и динамическая типизация не являются взаимоисключающими. Никто не мешает вам выводить и проверять типы во время компиляции, и это то, что делают большинство современных реализаций Common Lisp (также поддерживая объявления программистом). Динамическая типизация просто означает, что у вас также есть система типов, работающая во время выполнения.
 22 июн. 2009 г., 02:34
Ну, статическая типизация и ориентация на реальный объект противоречивы. Вы не можете иметь все.
 21 июн. 2009 г., 20:13
Я нахожусь на заборе о статической и динамической типизации. Я лично люблю Clojure и Haskell.

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

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

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

 19 июн. 2009 г., 04:46
@Nosredna Хирургический маленький.
 19 июн. 2009 г., 01:51
Насколько большие ножницы?
 19 июн. 2009 г., 01:23
Потому что пытаться программировать функционально на таком языке, как Python, все равно что пытаться косить 10 акров земли с помощью ножниц.
 19 июн. 2009 г., 01:56
Как работает C или Objective-C?
 19 июн. 2009 г., 01:48
Да, честно, это можно сделать, но это не идеальный подход. Я все еще не уверен, что расширение C - это плохая идея, хотя, я менее знаком с c ++, но сама идея делать такую вещь в цели c не кажется такой плохой. Вы можете запрограммировать функциональный C для своего сердца и использовать объекты, если хотите, я не могу понять, почему C ++ не смог бы сделать это легко. Я думаю, что моя глупость может ослепить меня;)

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

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

 19 июн. 2009 г., 04:47
Хорошее отношение там.
 19 июн. 2009 г., 06:06
Я не пытался никого обидеть.
 19 июн. 2009 г., 06:05
Эта последняя часть была моей идеей шутки. Обычно я не один для "purisim". По-видимому, хотя некоторые люди обиделись.
 19 июн. 2009 г., 08:23
sigh Я обновил пост до чего-то менее "оскорбительного".
 19 июн. 2009 г., 06:48
Я не считаю это оскорбительным (для кого-либо), но это привлекло несколько "оскорбительных" действий. голоса; Я рекомендую вам перефразировать последний пункт. Это довольно пафосно (не со Скоттом, а со стороны «обиженного»), поскольку этот пост явно не является «оскорбительным». Но мы здесь.

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

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

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

 Kai19 июн. 2009 г., 04:43
Я не столько озабочен чистотой, сколько удобочитаемостью. Я знаю, что многие языки поддерживают множество стилей программирования, но синтаксис языка во многом определяет, какой стиль является общепринятым. Я думаю, что Scala - это первое, что я увидел, который говорит: «Мы пытаемся сделать и то и другое!»
 09 мая 2011 г., 12:35
-1 за то, что учился в школе, и не отвечал на вопрос.

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

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

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

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

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

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

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

 09 мая 2011 г., 12:24
Зачем смешивать ОО и ФП? - Потому что это то, на что похож наш мир. Некоторые аспекты хорошо смоделированы с вневременными отношениями, другие нуждаются в жизненном цикле и состоянии.
OCaml O'Haskell (and object oriented programming is somewhat possible even in normal Haskell) Nemerle Possibly newLISP

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

Scala поднимает ступеньку, набирая функцию статически и работая под JVM.

 19 июн. 2009 г., 01:26
Зачем кому-то использовать Python для изучения функционального программирования? : \
 19 июн. 2009 г., 01:24
Python - отличное место для изучения некоторых принципов FP.
Решение Вопроса

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

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

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

 19 июн. 2009 г., 18:29
OCaml и F #, конечно, почти так же хороши, как и в синтаксисе Haskell, но они не позволяют абстрагироваться над конструкторами типов (без типов с более высоким родом). Скала не так хороша, но дает вам более высокие оценки. Если вы просто хотите написать более симпатичный код, это хорошо, но если вы хотите более мощные абстракции, варианты Caml не доставят вас туда.
 21 мая 2013 г., 11:09
Я бы сказал, что Haskell и F # красивее, чем OCaml.

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

 19 июн. 2009 г., 01:07
... а JavaScript тоже ОО и функционален ...
 19 июн. 2009 г., 01:03
Все, что является объектом, не обязательно является ООП, не так ли? В JavaScript практически все является объектом (включая функции, позволяющие выполнять некоторые функциональные задачи программирования).
 19 июн. 2009 г., 01:21
ОО не имеет ничего общего с классами. Многие ОО-языки не имеют классов: Smalltalk-71 (в конце концов, это язык, для которого был изобретен термин «ОО»), Self, Io, Ioke, ECMAScript (он же JavaScript), NewtonScript. Алан Кей очень ясно дал понять, что считает добавление классов в Smalltalk ошибкой, и с тех пор онinvented термин «объектно-ориентированный», мы могли бы даже пойти так далеко, чтобы сказать, что языки с классамиnot OO!
 19 июн. 2009 г., 01:48
Я не думаю, что Алан Кей больше решает, что такое ОО, а что нет. Я нашел это в Википедии: «Армстронг, Кварки объектно-ориентированного развития». В порядке убывания популярности «кварки» являются: наследование, объект, класс, инкапсуляция, метод, передача сообщений, полиморфизм, абстракция и т. д .;
 19 июн. 2009 г., 11:42
Согласно этому списку, Self (один изmost объектно-ориентированные языки, когда-либо изобретенные), Simula (первый в истории язык OO), Smalltalk-71 (язык, для которого был изобретен термин OO), JavaScript, Io, Ioke и NewtonScript не являются OO, потому что они не имеют классы. C ++, Java, C # не являются OO, потому что у них нет передачи сообщений. CLOS и Eiffel не являются OO, потому что у них нет методов. По факту,no Язык, существующий сегодня, за исключением Оз, имеет эти особенности. Вы утверждаете, что Oz - единственный язык OO?

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

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

Ваш ответ на вопрос