Re[5]: ФП против ООП
От: Курилка Россия http://kirya.narod.ru/
Дата: 12.09.06 12:15
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Здравствуйте, VladD2, Вы писали:


VD>>Давай уж конкретно. Тебе не нравятся классы? В ФЯ есть им полноценная замена?


L>Кстати, всё давно хочу написать как ООП решения, типа GoF паттернов решаются без классов с помощью ФВП.


Слушай, думал-думал, но так и не понял, что за ФВП? Функциональное что?
Re[10]: ФП против ООП
От: Cyberax Марс  
Дата: 12.09.06 12:19
Оценка:
граммофон wrote:
> C>Вероятно поэтому функциональщики предпочитают использовать
> C>message-passing-интерфейсы. Оно, конечно, хорошо — но не является полной
> C>заменой.
> В Haskell есть классы типов, в ML — функторы.
Вот если ты на них будешь пытаться сделать то, что описывается в GoF —
то получишь примерно такое же, что и в GoF (за некоторыми исключениями).
Потому как паттерны в GoF — это скорее руководство по тому как
использовать полиморфизм.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[5]: ФП против ООП
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.09.06 12:25
Оценка: +1
Здравствуйте, lomeo, Вы писали:

L>Что плохого в пиаре ФЯ?


Его качество. Он похож на внушение, постоянно скатывается на демагогию и зачастую говорит не всю правду.

Мне кажется, что это путь собрать вокруг ФП маргиналов и демагогов.

L> То, что ты подобное читал много раз?


Что?

L>>>

L>>>Ярив кроме того, что показывает то, как он пришёл в итоге к Эрлангу, рассказывает о том, насколько ООП добавляет больший оверхэд именно благодаря своим ООП-особенностям, тогда как в функциональном программировании контектс ограничивается функцией


VD>>Мне эти слова кажутся спорными.


L>Что именно?


Выделно жирным. ООП конечно же никакого оверхэда не создает. А то что кто-то сравнивает сахар одного языка с прямолинейностью другого — это не недостатки ООП, а недостатки того кто производит сравнения. Выражаясь прямо — очередная лож.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: ФП против ООП
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.09.06 12:25
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Кстати, всё давно хочу написать как ООП решения, типа GoF паттернов решаются без классов с помощью ФВП.


Это было бы очень интересно и полезно. Но не вижу причин противопоставлять одно другому. Есть не мало задачь отлично решаемых с помощью классов.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: ФП против ООП
От: граммофон  
Дата: 12.09.06 12:37
Оценка: +2
Здравствуйте, Cyberax, Вы писали:

C>граммофон wrote:

>> C>Вероятно поэтому функциональщики предпочитают использовать
>> C>message-passing-интерфейсы. Оно, конечно, хорошо — но не является полной
>> C>заменой.
>> В Haskell есть классы типов, в ML — функторы.
C>Вот если ты на них будешь пытаться сделать то, что описывается в GoF —
C>то получишь примерно такое же, что и в GoF (за некоторыми исключениями).
C>Потому как паттерны в GoF — это скорее руководство по тому как
C>использовать полиморфизм.

Изначально речь шла о том, что для большинства GoF-паттернов не нужны ни классы, ни перегрузки, ни функторов. Достаточно алгебраических типов и паттерн-матчинга.
И вырождаются они в нечто по 2-3 строчки.
То етсь теряют свой смысл как некий прием.
прежде чем понять рекурсию, необходимо понять рекурсию.
Re[8]: ФП против ООП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 12.09.06 12:40
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Вот это смотрел? Здесь, насколько я помню, о том, что в языках Lisp и Dylan большинство паттернов GoF невидимо или тривиально.

G>http://www.norvig.com/design-patterns/

Спасибо! Супер...

G>Однако, там упор на динамические свойства языков. В функциональных языках будет примерно то же самое, даже в строготипизированных, благодаря pattern-matching. Основная причина появления "паттернов" в ООП состоит в ограниченности динамического полиморфизма в модели ОО — вызов диспетчеризуется только по одному аргументу (this). Это заставляет в мало-мальски сложном случае городить лес из классов, размазывая по ним функционал. ФЯ с паттерн-матчингом позволяет выполнять другую группировку функционала, снимая ограничения на полиморфизм. Вот в все. В ФЯ практически нет паттернов в смысле GoF — там все делается прямолинейно.


Хотел собрать всё это в одном месте, для демонстрации (пиара ФП по VladD2)
Re[6]: ФП против ООП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 12.09.06 12:42
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Слушай, думал-думал, но так и не понял, что за ФВП? Функциональное что?


функции высшего порядка, сорри.
Re[9]: ФП против ООП
От: Gaperton http://gaperton.livejournal.com
Дата: 12.09.06 12:49
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Gaperton wrote:

>> ФЯ с паттерн-матчингом позволяет выполнять другую
>> группировку функционала, снимая ограничения на полиморфизм. Вот в все. В
>> ФЯ практически нет паттернов в смысле GoF — там все делается прямолинейно.
C>Однако, иногда полиморфизм используется именно для того, чтобы как раз
C>убрать эту группировку. Классический пример — приложение и плугины,
C>взаимодействие с плугинами идет через интерфейсы/абстрактные классы.

Ну, это не фокус, прямо скажем. В эрланге, например, есть два ортогональных способа это обеспечить.
1) Модули. На базе них "плагин" делается на раз-два. Просто программа предполагает, что в некотором (заранее неизвестном) модуле объявлены некоторые (заранее известные) функции. Пример — OTP behaviours. Никто не мешает делать так в любом языке. В SML вот, я слышал, имеется какое-то "исчисление модулей", наверняка как раз об этом.
2) Процессы. С ними взаимодействие идет через message-passing, что в случае Эрланга так же естественно, как дышать. Но это по сути своей объекты.

C>Вероятно поэтому функциональщики предпочитают использовать

C>message-passing-интерфейсы. Оно, конечно, хорошо — но не является полной
C>заменой.

Почему нет? Говорить про Эрланг — там с компонентностью все более чем в порядке, и ничего больш не нужно. Благодаря, конечно, процессам — они выполняют роль объектов при крупноблочной декомпозиции системы.
Re[9]: ФП против ООП
От: Кодт Россия  
Дата: 12.09.06 12:49
Оценка: 11 (1)
Здравствуйте, Cyberax, Вы писали:

G>> ФЯ с паттерн-матчингом позволяет выполнять другую группировку функционала, снимая ограничения на полиморфизм. Вот в все. В ФЯ практически нет паттернов в смысле GoF — там все делается прямолинейно.


C>Однако, иногда полиморфизм используется именно для того, чтобы как раз убрать эту группировку. Классический пример — приложение и плугины, взаимодействие с плугинами идет через интерфейсы/абстрактные классы.


C>Вероятно поэтому функциональщики предпочитают использовать message-passing-интерфейсы. Оно, конечно, хорошо — но не является полной заменой.


Так ведь и полиморфизм сделать — не есть большая сложность. Тип интерфейса — кортеж сигнатур функций. Реализация — замыкания функций на общую структуру данных.
type 'a MatStat = { median: () -> 'a; dispersion: () -> 'a; }

val matstatList : 'a list -> 'a MatStat
def matstatList xs =
    let m () = ..... (* считаем сумму, делим на длину, ну и т.д. *)
    and d () = .....
    in { median = m; dispersion = d; }
    end

val matstatContinuous : (float -> 'a) -> (float Option, float Option) -> 'a MatStat
def matstatContinuous f (x0,x1) =
    let m () = ..... (* численно находим интеграл... *)
    and d () = .....
    in { median = m; dispersion = d; }
    end
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[6]: ФП против ООП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 12.09.06 12:53
Оценка:
Здравствуйте, VladD2, Вы писали:

L>>Кстати, всё давно хочу написать как ООП решения, типа GoF паттернов решаются без классов с помощью ФВП.


VD>Это было бы очень интересно и полезно. Но не вижу причин противопоставлять одно другому. Есть не мало задачь отлично решаемых с помощью классов.


Я не особенно сравнивал ещё ОО и ФП, чтобы их противопоставлять :-(
Поэтому мне интересно было бы поискать такие задачи, которые решаются с помощью классов лучше, чем в ФП.

Ты можешь что нибудь предложить?
Re[12]: ФП против ООП
От: Cyberax Марс  
Дата: 12.09.06 12:54
Оценка:
граммофон wrote:
> C>Вот если ты на них будешь пытаться сделать то, что описывается в GoF —
> C>то получишь примерно такое же, что и в GoF (за некоторыми исключениями).
> C>Потому как паттерны в GoF — это скорее руководство по тому как
> C>использовать полиморфизм.
> Изначально речь шла о том, что для большинства GoF-паттернов не нужны ни
> классы, ни перегрузки, ни функторов. Достаточно алгебраических типов и
> паттерн-матчинга.
Для некоторых — да. Но многие паттерны (типа визитора или прокси)
специально задумывались, чтобы можно было распределять код.

Точно так же ведь можно и обычные виртуальные функции заменить switch'ем
(как частный случай pattern-matching'а). Но вот проблема в том, что
виртуальные функции как раз придумали чтобы заменить switch
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[6]: ФП против ООП
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 12.09.06 12:54
Оценка:
Курилка,

К>Слушай, думал-думал, но так и не понял, что за ФВП? Функциональное что?


Функции Высшего Порядка = HOF = Higher Order Functions
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[10]: ФП против ООП
От: Cyberax Марс  
Дата: 12.09.06 12:58
Оценка:
Кодт wrote:
> C>Вероятно поэтому функциональщики предпочитают использовать
> message-passing-интерфейсы. Оно, конечно, хорошо — но не является полной
> заменой.
> Так ведь и полиморфизм сделать — не есть большая сложность. Тип
> интерфейса — кортеж сигнатур функций. Реализация — замыкания функций на
> общую структуру данных.
Просто при использовании такого полиморфизма получим тот же GoF.
Собственно, именно это я и пытаюсь сказать.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[6]: ФП против ООП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 12.09.06 12:59
Оценка: 1 (1)
Здравствуйте, VladD2, Вы писали:

L>>Что плохого в пиаре ФЯ?


VD>Его качество. Он похож на внушение, постоянно скатывается на демагогию и зачастую говорит не всю правду.

VD>Мне кажется, что это путь собрать вокруг ФП маргиналов и демагогов.

Мне так не показалось. Но я понял, это ИМХО, так что не буду спорить.

VD>Выделно жирным. ООП конечно же никакого оверхэда не создает. А то что кто-то сравнивает сахар одного языка с прямолинейностью другого — это не недостатки ООП, а недостатки того кто производит сравнения. Выражаясь прямо — очередная лож.


Вот ты говоришь — сахар, сахар. ОО — это же тоже сахар, в таком случае. Но одновременно это и способ мышления. Когда я пишу на ОО, я думаю в объектах, когда на ФЯ — в действиях. Поэтому сахар тут не при чём. Дело в том, что (по моему опыту) думать в объектах приходится больше, чем в действиях. И это понятно — Гапертон объяснил почему. А разница в этих двух "думать" и есть оверхед, который создаёт ОО.
Re[10]: ФП против ООП
От: Cyberax Марс  
Дата: 12.09.06 13:07
Оценка:
Gaperton wrote:
> C>Однако, иногда полиморфизм используется именно для того, чтобы как раз
> C>убрать эту группировку. Классический пример — приложение и плугины,
> C>взаимодействие с плугинами идет через интерфейсы/абстрактные классы.
> Ну, это не фокус, прямо скажем. В эрланге, например, есть два
> ортогональных способа это обеспечить.
> 1) Модули. На базе них "плагин" делается на раз-два. Просто программа
> предполагает, что в некотором (заранее неизвестном) модуле объявлены
> некоторые (заранее известные) функции.
Это как раз пример name-based полиморфизма. Просто Erlang — динамический
язык и ему не надо явно выделять наборы сигнатур функций. А если их явно
выделить — получатся старые добрые интерфейсы

> Пример — OTP behaviours. Никто не мешает делать так в любом языке.

> В SML вот, я слышал, имеется какое-то "исчисление модулей", наверняка
> как раз об этом.
Посмотрю.

> C>Вероятно поэтому функциональщики предпочитают использовать

> C>message-passing-интерфейсы. Оно, конечно, хорошо — но не является полной
> C>заменой.
> Почему нет? Говорить про Эрланг — там с компонентностью все более чем в
> порядке, и ничего больш не нужно. Благодаря, конечно, процессам — они
> выполняют роль объектов при крупноблочной декомпозиции системы.
Я тебе приводил мой пример — сейчас я его переписываю в более
функциональном стиле, но все же полностью не получится. Да и, как бы его
не ругали, RPC — это удобная вещь.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[7]: ФП против ООП
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 12.09.06 13:11
Оценка:
lomeo,

L>Я не особенно сравнивал ещё ОО и ФП, чтобы их противопоставлять

L>Поэтому мне интересно было бы поискать такие задачи, которые решаются с помощью классов лучше, чем в ФП.

L>Ты можешь что нибудь предложить?


Хм. Вроде бы у меня есть кандидат — GUI. Батоны, окна, батнклики и проч...

Библиотеку gs из Эрланга (или её аналог из Хаскеля) не предлагать, ибо там взаимодействие между виджетами осуществляется через асинхронную передачу сообщений => работа основана на побочных эффектах, то есть посылках сообщений.

Интересует подход в рамках чистого ФП, причём можно было бы динамически создавать виджеты, менять их состояние, вешать длительные вычисления на события и т.п., короче всё как в нормальной импиративной GUI-библиотеке а ля Swing, SWT, WinForms etc.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[3]: ФП против ООП
От: FDSC Россия consp11.github.io блог
Дата: 12.09.06 13:13
Оценка:
Здравствуйте, thesz, Вы писали:

FDS>> Читая эту статью я так и не понял, за счёт чего ФЯ устраняют оверхед. Ну и что, что "я могу быть спокоен, что никакие поля не изменяются"? В ООП я то же могу быть спокоен: ведь приватная часть от меня скрыта, она мала и скорее всего там всё изменяется согласованно, и если код класса написан правильно и система правильно декомпозирована на классы, то все последсвия применения методов должны быть очевидны ( не бейте ногами за это выражение, но ведь он то же ничего не доказывает). Потом, функции можно объединить в группы и получим... ФЯ ООП .


T>"скорее всего всё изменяется согласованно," "если код класса написан правильно," "система правильно декомпозирована."


T>Три условия должны выполняться одновременно.


T>Для ФЯ это никуда не девается, но получить получается легче.


Личное мнение. Бездоказательное.
Re[7]: ФП против ООП
От: FR  
Дата: 12.09.06 13:14
Оценка:
Здравствуйте, lomeo, Вы писали:


L>Я не особенно сравнивал ещё ОО и ФП, чтобы их противопоставлять

L>Поэтому мне интересно было бы поискать такие задачи, которые решаются с помощью классов лучше, чем в ФП.

L>Ты можешь что нибудь предложить?


GUI
Re[13]: ФП против ООП
От: граммофон  
Дата: 12.09.06 13:17
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Точно так же ведь можно и обычные виртуальные функции заменить switch'ем

C>(как частный случай pattern-matching'а). Но вот проблема в том, что
C>виртуальные функции как раз придумали чтобы заменить switch

А классы придумали, чтобы заменить указатели на функции.
Хорошая такая замена!

Если уж на чистом Си у меня все эти прокси требуют раз в 10 меньше кода, чем на ОО-языках, то в функциональном случае это даже обсуждения не стоит.
прежде чем понять рекурсию, необходимо понять рекурсию.
Re[8]: ФП против ООП
От: граммофон  
Дата: 12.09.06 13:30
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Интересует подход в рамках чистого ФП, причём можно было бы динамически создавать виджеты, менять их состояние, вешать длительные вычисления на события и т.п., короче всё как в нормальной импиративной GUI-библиотеке а ля Swing, SWT, WinForms etc.


http://www.md.chalmers.se/Cs/Research/Functional/Fudgets/
http://www.haskell.org/fruit/

чуть ближе к нaтиву:
http://wxhaskell.sourceforge.net/

Вообще же по опыту лучше всего на GUI ложатся пролог и всякая автоматная логика.
прежде чем понять рекурсию, необходимо понять рекурсию.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.