Re[11]: ФП против ООП
От: mihoshi Россия  
Дата: 13.09.06 06:14
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>ФП и ООП могут выражаться друг через друга

Нет.

VD>а стало быть легко могут сосуществовать в рамках одной модели и даже одного языка.

Да.
Re[9]: ФП против ООП
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 13.09.06 07:37
Оценка:
gandalfgrey,

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

G>Для Ерланга есть другая либа gtkNode
...
G>Но, конечно, все на сообщениях...
Принципиальной разницы между gs и gtkNode нет. Поэтому отметаем.

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

G>А все это можно — сообщения и процессы "спасут отца русской демократии" ! 8))
Да, асинхронный обмен рулит и т.д. и т.п., но где здесь ФП? Напомню, спор вызвал тезис lomeo:

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

quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[8]: ФП против ООП
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 13.09.06 08:20
Оценка: +1 :)
Здравствуйте, VladD2, Вы писали:

VD>1. Сопоставление с образцом (сахар для if-ов и switch-ей).


Это ниразу не сахар для if-ов и switch-ей

VD>2. Алгеброические типы (сахар для классов).


Ни разу не сахар для классов.
http://www.smalltalk.ru | << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[15]: ФП против ООП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 13.09.06 08:35
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Визитор нужен для разделения обхода и обработки. Например, FR приводил

C>пример с обходом AST в Питоне. Без визитора был бы длииииииииииинный
C>метод, а так его можно просто разбить на разные классы.

Это не совсем точно. Визитор использует разделение обхода и обработки. Но нужен он не для этого.

Описывает операцию, выполняемую с каждым объектом из некоторой структуры. Паттерн посетитель позволяет определить новую операцию, не изменяя классы этих объектов.


Из-за наличия диспетчеризации по нескольким параметрам (паттерн матчинг + ФВП) этот паттерн легко расписывается на ФЯ.
Re[9]: ФП против ООП
От: Gaperton http://gaperton.livejournal.com
Дата: 13.09.06 08:55
Оценка: +2 :))) :))) :))
Здравствуйте, Andrei N.Sobchuck, Вы писали:

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


VD>>1. Сопоставление с образцом (сахар для if-ов и switch-ей).


ANS>Это ниразу не сахар для if-ов и switch-ей


VD>>2. Алгеброические типы (сахар для классов).


ANS>Ни разу не сахар для классов.


Да лана тебе. Все равно Ифы и Свитчи — сахар для команд JNZ и JZ, а функции — сахар для инструкций CALL и RET.
Re[8]: ФП против ООП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 13.09.06 09:11
Оценка: +1
Здравствуйте, VladD2, Вы писали:

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


VD>Любые задачи эмуляции чего-то с сотоянием. Особенно если требуется получить быстрое решение с малым расходом памяти.


Согласен у состояний на ФП много недостатков. Самый неприятный для меня — это добавление в состояние ещё одной переменной. Но ты говоришь о сайд-эффекте, а я об ООП. В данном случае наличие или отсутствие классов не играет роли.
Re[10]: ФП против ООП
От: FR  
Дата: 13.09.06 09:14
Оценка: +1
Здравствуйте, Gaperton, Вы писали:


G>Да лана тебе. Все равно Ифы и Свитчи — сахар для команд JNZ и JZ, а функции — сахар для инструкций CALL и RET.


На современных x86 они тоже сахар для RISC микрокодов
Re[16]: ФП против ООП
От: FR  
Дата: 13.09.06 09:14
Оценка:
Здравствуйте, lomeo, Вы писали:

C>>Визитор нужен для разделения обхода и обработки. Например, FR приводил

C>>пример с обходом AST в Питоне. Без визитора был бы длииииииииииинный
C>>метод, а так его можно просто разбить на разные классы.

L>Это не совсем точно. Визитор использует разделение обхода и обработки. Но нужен он не для этого.


L>

Описывает операцию, выполняемую с каждым объектом из некоторой структуры. Паттерн посетитель позволяет определить новую операцию, не изменяя классы этих объектов.


L>Из-за наличия диспетчеризации по нескольким параметрам (паттерн матчинг + ФВП) этот паттерн легко расписывается на ФЯ.


Расписывается легко, но в результате все получается внутри одной функции, что может быть проблемой если нужна легкая расширяемость.
Re[17]: ФП против ООП
От: Курилка Россия http://kirya.narod.ru/
Дата: 13.09.06 09:38
Оценка:
Здравствуйте, FR, Вы писали:

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


L>>Из-за наличия диспетчеризации по нескольким параметрам (паттерн матчинг + ФВП) этот паттерн легко расписывается на ФЯ.


FR>Расписывается легко, но в результате все получается внутри одной функции, что может быть проблемой если нужна легкая расширяемость.


Кто сказал что внутри одной функции? Мультиметоды на то и мульти- Много их — столько сколько захочешь
Re[8]: ФП против ООП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 13.09.06 09:40
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Когда я думаю, то оверхэда не бывает. Оверхэд получается когда я пытаюсь выразить свои мысли в виде кода.


Оверхед получается из-за того, что о действиях думают как об объектах. Отсюда все эти генераторы, треды, различные менеджеры чего-то там.

VD>Так вот его то сахар и убирает. Во многих ООЯ сахара просто недостаточно. От того и выражение мыслей бывает более длинным и запутанным.


Не согласен. Паттерн матчинг и АТД — не сахар — это подход, другой способ взглянуть на вещи. А уж ФВП сахаром назвать язык не повернётся. А ведь они, может быть, самая важная вещь для обсуждаемого вопроса.

VD>Вот когда я пишу на том же Немерле подоставляющем тот самый сахар не только для функциональной, но и для императивной части, то оверхэда получается не много. Сишные скобки и то больше создают. От того и решения получаются помпактными и понятными.


Воспрос не о императивный vs функциональный, а об объектно-ориентированный vs функциональный и о том, насколько больше приходится держать в голове в случае ОО.

VD>И вообще, большой вопрос что считать функциональным, а что императивным. Лично я считаю фунциональным стиль программирования в котором программист старается использовть вычисление выражений вместо выполнения инструкций. Гапертон же тут рядом заявил, что если в программе используется модификация переменных, то это уже "императивщина" (таки оскорбление какое-то :) ).


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

VD>Так вот можно без проблем писать очень компактный и выразительный код во всю используя модификацию переменных. И программа от этого сложнее не или непонятнее не станет. Так что если определять ФП как это делает Гапертон, то ФП вообще мало чего дает.


Не понял, почему?

VD>Я считаю, что пропагандируемем выразительность ФП в основном основывается на сахаре добавленном в ФЯ. Так я бы выделил:

VD>1. Сопоставление с образцом (сахар для if-ов и switch-ей).
VD>2. Алгеброические типы (сахар для классов).
VD>3. Спец.синтаксис (сахар для работы со списками, строками, и т.п.).
VD>4. Операции над функциями (частичное применение, локальные функции, лямбды).

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

VD>А сказки про то что изменение переменных ужасно усложняет программу, они и есть сказки. Я не испытвал проблем с этим в C# нигогда. Достаточно было выполнять несколько простых правил и проблема исчезала сама собой.


Ну так, а в ФП для этого даже не надо выполнять эти правила! Из-за этих правил опять таки в мыслях оверхед.

VD>Меж тем модификация переменных иногда может быть очень полезна даже если используется весь перечисленный выше сахар. Ни один из приведенных аспектов не противоречит императивному программированию. Не мудренно что из ФЯ в таких условиях пытаются сделать религию.


Я сейчас не об императивном говорил, а об объектно-ориентированном. А так — да, понятно, что все эти подходы могут существовать вместе. Важно выделить преимущества и недостатки их друг перед другом. Например, при использовании ОО получается больший оверхед, чем при использовании функциональщины ;-)
Re[17]: ФП против ООП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 13.09.06 09:45
Оценка:
Здравствуйте, FR, Вы писали:

L>>Из-за наличия диспетчеризации по нескольким параметрам (паттерн матчинг + ФВП) этот паттерн легко расписывается на ФЯ.


FR>Расписывается легко, но в результате все получается внутри одной функции, что может быть проблемой если нужна легкая расширяемость.


А?!


data Tree a = Node a | Branch (Tree a) (Tree a)

visit n@(Node _)   f = f n
visit t@(Tree l r) f = do
    f t
    f l
    f r

-- один визитор
treeLength _ = update (+1)

-- второй визитор
treeSum (Node a) = update (+a)
treeSum _        = get


Тут проблема точно такая же как в паттерне Visitor — при расширении типа данных приходится проходить по всем посетителям.
Re[10]: ФП против ООП
От: gandalfgrey  
Дата: 13.09.06 10:09
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Принципиальной разницы между gs и gtkNode нет. Поэтому отметаем.

Разница единственно в том, что в одном случа используется TK, а в другом GTK. В обоих случаях ГУЙ может находиться на другой машине.

LCR>Да, асинхронный обмен рулит и т.д. и т.п., но где здесь ФП? Напомню, спор вызвал тезис lomeo:

LCR>[q]
Тут я затрудняюсь привести какой-то особый пример для ГУЯ. Сообщения — они как-то от языка не зависят. Для их обработки весьма хорош и приятен паттерн-матчинг, но это не особенность ФЯ
Вот разве что в Clean был весьма специфичный ГУЙ, прямо заточенный под язык...
Re[18]: ФП против ООП
От: FR  
Дата: 13.09.06 12:54
Оценка:
Здравствуйте, Курилка, Вы писали:


L>>>Из-за наличия диспетчеризации по нескольким параметрам (паттерн матчинг + ФВП) этот паттерн легко расписывается на ФЯ.


FR>>Расписывается легко, но в результате все получается внутри одной функции, что может быть проблемой если нужна легкая расширяемость.


К>Кто сказал что внутри одной функции? Мультиметоды на то и мульти- Много их — столько сколько захочешь


Мы вроде про паттерн матчинг а не мультиметоды, хотя и с их помощью можно решить то что делается визитером.
Re[18]: ФП против ООП
От: FR  
Дата: 13.09.06 12:54
Оценка: +1
Здравствуйте, lomeo, Вы писали:

L>Тут проблема точно такая же как в паттерне Visitor — при расширении типа данных приходится проходить по всем посетителям.


Угу про это и речь.
Да и еще это у тебя в хаскеле несколько функций(хотя логически она тоже одна) а ML и Nemerle будет одна, тут уже в философии прошлись по поводу размеров таких функций
Re[19]: ФП против ООП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 13.09.06 13:00
Оценка: +1
Здравствуйте, FR, Вы писали:

FR>Да и еще это у тебя в хаскеле несколько функций(хотя логически она тоже одна) а ML и Nemerle будет одна, тут уже в философии прошлись по поводу размеров таких функций :)


Это общая проблема switch'ей — они имеет тенденцию распухать.
Re[11]: ФП против ООП
От: Gaperton http://gaperton.livejournal.com
Дата: 13.09.06 13:43
Оценка: 41 (2) +5
Здравствуйте, Cyberax, Вы писали:

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

>> C>message-passing-интерфейсы. Оно, конечно, хорошо — но не является полной
>> C>заменой.
>> Почему нет? Говорить про Эрланг — там с компонентностью все более чем в
>> порядке, и ничего больш не нужно. Благодаря, конечно, процессам — они
>> выполняют роль объектов при крупноблочной декомпозиции системы.
C>Я тебе приводил мой пример — сейчас я его переписываю в более
C>функциональном стиле, но все же полностью не получится. Да и, как бы его
C>не ругали, RPC — это удобная вещь.

Дык, объекты, на самом-то деле, рулят . На крупном уровне, для декомпозиции системы. А на мелком, когда через них пытаются полиморфизм выразить на каждый писк — они нифига не рулят, там рулит ФП. И RPC штука хорошая. Просто каждая штука хороша на своем месте.

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

Вот так — все на своем месте. Именно так спроектирован пресловутый мегасвитч AXD301. И так принято писать на Эрланге — уже сложившаяся практика, доказавшая свою эффективность и удобство в больших проектах. И, главное — так вполне можно, без проблем, писать на OCaml и Nemerle.
Re[9]: ФП против ООП
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.09.06 14:37
Оценка: :)
Здравствуйте, Andrei N.Sobchuck, Вы писали:

VD>>1. Сопоставление с образцом (сахар для if-ов и switch-ей).


ANS>Это ниразу не сахар для if-ов и switch-ей


Твои знания потрясают.

VD>>2. Алгеброические типы (сахар для классов).


ANS>Ни разу не сахар для классов.


Опять же.

ЗЫ

Целяйся сильнее за свой Смолток. Это то что нужно для того чтобы отстать на век.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: ФП против ООП
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.09.06 14:37
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Да лана тебе. Все равно Ифы и Свитчи — сахар для команд JNZ и JZ, а функции — сахар для инструкций CALL и RET.


В общем-то так оно и есть, с точки зрения ассемблера. Провести точню грань между сахаром и базой практически невозможно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Purely-functional Object-Oriented System in Scheme
От: z00n  
Дата: 13.09.06 14:53
Оценка: 36 (5)
Здравствуйте, Gaperton, Вы писали:

G>Тот факт, что ты можешь изобразить замыкание на классах, равным счетом ничего не меняет — это частный случай. Класс на замыканиях ты не изоюразишь никогда.


http://pobox.com/~oleg/ftp/Scheme/pure-oo-system.scm

;     Purely-functional Object-Oriented System in Scheme
;
; The present code implements a classless, delegation-based OO system, similar
; to those of Self or Javascript. This is a full-fledged OO system with
; encapsulation, object identity, inheritance and polymorphism. It is also
; a purely functional system: there is not a single assignment or
; other mutation in the code below.
;
; A closure (encapsulating a message map, and private parameters if any)
; is the object in this system. Sending a message to an object -- i.e.,
; applying the object to a message selector and arguments, -- results
; in a list. Its head is the object in a new state, having processed the
; message; the rest of the list are the results of the message if any.
; Objects' identity is decided by an eq? predicate applied to the result of
; an 'identity' message. A "set-x" method returns an object with a new state,
; but with the same identity as the source object. An object in a changed
; state is in a sense a "child" of the original object. No wonder
; implementations of "mutation" and inheritance are so similar in this
; OO system.
;
; This code was meant to be "light"; therefore it deliberately uses only the
; most basic Scheme constructions. No macros/syntactic closures are employed
; (although they are certainly possible and appropriate).
;
; This code has been discussed in an article "Re: FP, OO and relations. Does
; anyone trump the others?"
; posted on comp.lang.smalltalk, comp.lang.functional, and comp.lang.scheme
; on Wed Dec 29 05:13:58 1999 GMT, Message-ID: <84c4qe$48j$1@nnrp1.deja.com>
; See also http://pobox.com/~oleg/ftp/Scheme/oop-in-fp.txt
; The article presents a more familiar OO system with mutations, and contrasts
; it with a purely-functional OO system, which is implemented in this present
; file.
...
...
Re[12]: ФП против ООП
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.09.06 14:55
Оценка:
Здравствуйте, mihoshi, Вы писали:

VD>>ФП и ООП могут выражаться друг через друга

M>Нет.

Обоснование есть? Я вижу это повсеместно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.