method(obj) то же самое, что и obj.method() ? Что за бред!
От: LaPerouse  
Дата: 04.07.07 13:20
Оценка: -6 :)))
Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта

ObjectClass::method();

может быть заменен на ObjectClass method(ObjectClass),

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

Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.

class A implements I
{
    int state;
    
    void method() {}
}

class B implements I
{
    int state;
    
    void method() {}
}


В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями. Придется использовать pattern matching, и хорошо еще, что если он поддерживается напрямую языком. Отсюда следует естественный вывод, что высказывания такого рода — низкопробная лажа, не выдерживающая никакой критики.
Кто что думает по этому поводу? Надеюсь, дискусия, если она вообще состоится, не превратится в спор pattern matching vs виртуальные функции.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re: method(obj) то же самое, что и obj.method() ? Что за бре
От: Кодёнок  
Дата: 04.07.07 13:39
Оценка:
Здравствуйте, LaPerouse, Вы писали:

Если речь о реализации языка программирования, то реализовать правильный вызов виртуального метода по интерфейсу очень легко, и многие языки это успешно делают. Это на самом деле упрощает и язык и реализацию, не приходится вводить кучу извращений как в С++ (A::* a.*b a->*b)

Если речь идет о таком стиле кодирования — замене конструкций obj.foo(bar) на foo(obj, bar), то конечно, нет, не надо.
Re[2]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 04.07.07 13:52
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Здравствуйте, LaPerouse, Вы писали:


Кё>Если речь о реализации языка программирования, то реализовать правильный вызов виртуального метода по интерфейсу очень легко, и многие языки это успешно делают. Это на самом деле упрощает и язык и реализацию, не приходится вводить кучу извращений как в С++ (A::* a.*b a->*b)


Кё>Если речь идет о таком стиле кодирования — замене конструкций obj.foo(bar) на foo(obj, bar), то конечно, нет, не надо.


Да, безусловно нормальному человеку так и должно казаться. Однако вопрос содержал неявно обозначенный подтекст. Дело в том, что подобные "перлы" обычно исходячт от т н "функциональщиков", клеймящих ООП и все, что с ним связано.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re: method(obj) то же самое, что и obj.method() ? Что за бре
От: aka50 Россия  
Дата: 04.07.07 14:07
Оценка: +2
Здравствуйте, LaPerouse, Вы писали:

LP>Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта

Где бытует?

LP>ObjectClass::method();

LP>может быть заменен на ObjectClass method(ObjectClass),
LP>который уже и не метод вовсе, а функция, которая принимает на вход объект класса ObjectClass, и возвращает измененый объект вместо того, чтобы изменять его состояние.
LP>Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.

Полиморфизм может достигаться не только наследованием. Наследование, мультиметоды (это как раз то, что ты описал) и type classes — это все позволяет реализовать полиморфизм, только разными способами... http://en.wikipedia.org/wiki/Multiple_dispatch http://nice.sourceforge.net/

// skip


void laugh(String str){
  println("haha, I'm holding an instance of " str);
}

let myString = new String("Andy");
myString.laugh();


LP>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.

Почему это?
(defmethod collide-with ((x asteroid) (y asteroid))
  ;; deal with asteroid hitting asteroid
)
(defmethod collide-with ((x asteroid) (y spaceship))
  ;; deal with asteroid hitting spaceship
)
(defmethod collide-with ((x spaceship) (y asteroid))
  ;; deal with spaceship hitting asteroid
)
(defmethod collide-with ((x spaceship) (y spaceship))
  ;; deal with spaceship hitting spaceship
)
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: aka50 Россия  
Дата: 04.07.07 14:16
Оценка:
Здравствуйте, LaPerouse, Вы писали:

Кё>>Если речь идет о таком стиле кодирования — замене конструкций obj.foo(bar) на foo(obj, bar), то конечно, нет, не надо.

LP>Дело в том, что подобные "перлы" обычно исходячт от т н "функциональщиков", клеймящих ООП и все, что с ним связано.
Функциональщики возвращают _новый_ объект, а не измененный.
Re: method(obj) то же самое, что и obj.method() ? Что за бре
От: IB Австрия http://rsdn.ru
Дата: 04.07.07 14:23
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта

Не любой... А только тот, который не имеет доступа к закрытым методам и полям объекта. То есть тот, функционал которого можно реализовать пользуясь только публичным контрактом объекта.

LP>который уже и не метод вовсе, а функция, которая принимает на вход объект класса ObjectClass, и возвращает измененый объект вместо того, чтобы изменять его состояние.

Угу.

LP> Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.

Если сделать это явно, то уже не полиморфизм?

LP>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.

Хм...
Method(A a)
Method(B b)
Уже отменили? И двойную диспетчерезацию вместе с визиторами?

LP> Отсюда следует естественный вывод, что высказывания такого рода — низкопробная лажа, не выдерживающая никакой критики.

LP>Кто что думает по этому поводу? Надеюсь, дискусия, если она вообще состоится, не превратится в спор pattern matching vs виртуальные функции.
Ты точно на дискуссию надеялся, когда это писал?
На самом деле, крайности вредны, меру надо знать. Но при проектировании, прежде чем делать функцию методом класса, надо три раза подумать — действительно ли она там нужна.
Объяснение очень простое и логичное — каждый метод-член класса, который можно вынести во внешнюю функцию, уменьшает инкапсуляцию и увеличивает связность, что, в свою очередь, увеличивает стоимость поддержки.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re: method(obj) то же самое, что и obj.method() ? Что за бре
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 04.07.07 17:32
Оценка: +1
Здравствуйте, LaPerouse, Вы писали:

LP>Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.


Это, а в чём преимущество точечной нотации перед функциональной, в плане организации полиморфизма. В Хаскелле вон полиморфизм покруче будет, чем во всяких Явах.

[skip]

LP>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.


Это кто тебе сказал? Почему-то в Хаскелле я могу делать перегрузку, причём даже на по одному параметру, а по нескольким. Там есть такие возможности, что Java и не снились.

LP> Придется использовать pattern matching, и хорошо еще, что если он поддерживается напрямую языком. Отсюда следует естественный вывод, что высказывания такого рода — низкопробная лажа, не выдерживающая никакой критики.


А при чём тут pattern matchin?

LP>Кто что думает по этому поводу? Надеюсь, дискусия, если она вообще состоится, не превратится в спор pattern matching vs виртуальные функции.


Нет, не превратится, т.к. это вообще разные вещи, предназначенные для разных вещей.
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re: method(obj) то же самое, что и obj.method() ? Что за бре
От: deniok Россия  
Дата: 04.07.07 18:14
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта


LP>ObjectClass::method();


LP>может быть заменен на ObjectClass method(ObjectClass),


LP>который уже и не метод вовсе, а функция, которая принимает на вход объект класса ObjectClass, и возвращает измененый объект вместо того, чтобы изменять его состояние.


LP>Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.


А ты взгляни на это с другой стороны. Все функции изначально абсолютно полиморфны

-- для любого типа a функция f имеет тип a -> a, 
-- то есть принимает объект типа a и возвращает объект типа a
forall a. f :: a -> a

А дальше все ограничения на полиморфизм накладываются реализацией этой функции
-- опс, появилась операция +, значит x должен выставлять "интерфейс", в котором определён оператор +
f x = x + 1

В Хаскелле оператор + определён в "интерфейсе" Num (на самом деле это называется класс типа, штука довольно сильно обобщающая понятие интерфейса). Таким образом, тип функции f ограничивается этим интерфейсом
-- в том контексте, что a принадлежит классу типа Num,
-- функция f имеет тип a -> a
f :: Num a => a -> a

Добавляем ещё операции, получаем дополнительные контексты:
-- Оператор > определён в классе типа Ord
f :: (Ord a, Num a) => a -> a
f x = if x>0 then x+1 else x-1

Одна из фишек в том, что, поскольку типы выводятся, их указывать необязательно.
Re[4]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 04.07.07 18:25
Оценка:
Здравствуйте, aka50, Вы писали:

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


Кё>>>Если речь идет о таком стиле кодирования — замене конструкций obj.foo(bar) на foo(obj, bar), то конечно, нет, не надо.

LP>>Дело в том, что подобные "перлы" обычно исходячт от т н "функциональщиков", клеймящих ООП и все, что с ним связано.
A>Функциональщики возвращают _новый_ объект, а не измененный.

Под измененным объектом имеется ввиду измененная КОПИЯ объекта.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 04.07.07 18:25
Оценка:
Здравствуйте, aka50, Вы писали:

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


LP>>Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта

A>Где бытует?

Да хотя бы здесь. На этом форуме. Хотите — потрачу время и найду?

LP>>ObjectClass::method();

LP>>может быть заменен на ObjectClass method(ObjectClass),
LP>>который уже и не метод вовсе, а функция, которая принимает на вход объект класса ObjectClass, и возвращает измененый объект вместо того, чтобы изменять его состояние.
LP>>Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.

A>Полиморфизм может достигаться не только наследованием. Наследование, мультиметоды (это как раз то, что ты описал) и type classes — это все позволяет реализовать полиморфизм, только разными способами... http://en.wikipedia.org/wiki/Multiple_dispatch http://nice.sourceforge.net/


A>
A>// skip
A>


A>
A>void laugh(String str){
A>  println("haha, I'm holding an instance of " str);
A>}

A>let myString = new String("Andy");
A>myString.laugh();
A>


LP>>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.

A>Почему это?
A>
A>;(defmethod collide-with ((x asteroid) (y asteroid))
A>;  ;; deal with asteroid hitting asteroid
A>;)
A>;(defmethod collide-with ((x asteroid) (y spaceship))
A>;  ;; deal with asteroid hitting spaceship
A>;)
A>;(defmethod collide-with ((x spaceship) (y asteroid))
A>;  ;; deal with spaceship hitting asteroid
A>;)
A>;(defmethod collide-with ((x spaceship) (y spaceship))
A>;  ;; deal with spaceship hitting spaceship
A>;)
A>;


Ну это же, черт возьми в Лиспе. Я же говорил про языки класса C++/Java. Там, придется ограничиться if-ами, хотя есть паттерны, которые позволяют это дело сгладить.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 04.07.07 18:25
Оценка:
Здравствуйте, IB, Вы писали:

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


LP>>Я смотрю, в последнее время бытует следующее, на мой взгляд извращенное, представление — что любой метод объекта

IB>Не любой... А только тот, который не имеет доступа к закрытым методам и полям объекта. То есть тот, функционал которого можно реализовать пользуясь только публичным контрактом объекта.

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

LP>>который уже и не метод вовсе, а функция, которая принимает на вход объект класса ObjectClass, и возвращает измененый объект вместо того, чтобы изменять его состояние.

IB>Угу.

LP>> Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.

IB>Если сделать это явно, то уже не полиморфизм?

Если это сделать явно, то это уже не полиморфизм, а х з что.

if (obj instanceof A)
//
else if (obj instnceof B)
//..


LP>>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.

IB>Хм...
IB>Method(A a)
IB>Method(B b)

Это вообще к чему?
В данном случае вам придется делать ЯВНОЕ преобразование типа, те с помощью рантаймовой инфы узнавать тип объекта, делать нужный каст и вызывать нужную функцию, либо ловить ClassCastException Какой к черту полиморфизм?


LP>> Отсюда следует естественный вывод, что высказывания такого рода — низкопробная лажа, не выдерживающая никакой критики.

LP>>Кто что думает по этому поводу? Надеюсь, дискусия, если она вообще состоится, не превратится в спор pattern matching vs виртуальные функции.
IB>Ты точно на дискуссию надеялся, когда это писал?
IB>На самом деле, крайности вредны, меру надо знать. Но при проектировании, прежде чем делать функцию методом класса, надо три раза подумать — действительно ли она там нужна.

Я это не отрицаю

IB>Объяснение очень простое и логичное — каждый метод-член класса, который можно вынести во внешнюю функцию, уменьшает инкапсуляцию и увеличивает связность, что, в свою очередь, увеличивает стоимость поддержки.


Чертовски верно сказано. Так я о том же.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 04.07.07 18:34
Оценка:
Здесь и далее — LaPerouse — это Perseus, а Perseus — это LaPerouse. То есть я на работе я LaPerouse, дома — Perseus
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 04.07.07 18:57
Оценка:
Здравствуйте, konsoletyper, Вы писали:

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


LP>>Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.


K>Это, а в чём преимущество точечной нотации перед функциональной, в плане организации полиморфизма. В Хаскелле вон полиморфизм покруче будет, чем во всяких Явах.


О черт, опять этот Хаскель. И тут Хаскель, и там Хаскель, такое ощущение, что это — образец трепетного поклонения.


LP>> Придется использовать pattern matching, и хорошо еще, что если он поддерживается напрямую языком. Отсюда следует естественный вывод, что высказывания такого рода — низкопробная лажа, не выдерживающая никакой критики.


K>А при чём тут pattern matchin?


При том, что один из способов реализовать некое подобие полиморфизма — это pattern matching. Другой — мультиметоды. Ни того, ни другого нет ни в Java, ни в С++. Я имею ввиду. конечно, нпсредственную поддержку языка.

LP>>Кто что думает по этому поводу? Надеюсь, дискусия, если она вообще состоится, не превратится в спор pattern matching vs виртуальные функции.


K>Нет, не превратится, т.к. это вообще разные вещи, предназначенные для разных вещей.


Это, как вы выразились, "вещи", предназначенные для других вещей, но позволяющие, пусть и разными способами, реализовать одно и то же — полиморфизм на основе типов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 04.07.07 19:06
Оценка:
Здравствуйте, Perseus, Вы писали:

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


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


LP>>>Но ведь method — это не просто некая функция, которая оперирует с данными объекта. Как минимум, туда вшита неявно информация о типе, и это помогает организовать полиморфизм.


K>>Это, а в чём преимущество точечной нотации перед функциональной, в плане организации полиморфизма. В Хаскелле вон полиморфизм покруче будет, чем во всяких Явах.


P>О черт, опять этот Хаскель. И тут Хаскель, и там Хаскель, такое ощущение, что это — образец трепетного поклонения.


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

В Яве принципиально другой подход к типам, поэтому там идея эквивалентности o.m(p) и o <- m(o,p) действительно не очень плодотворна. Но ты же спрашивал вообще, а не конкретно про Яву.
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 04.07.07 19:13
Оценка:
Здравствуйте, Perseus, Вы писали:

K>>Это, а в чём преимущество точечной нотации перед функциональной, в плане организации полиморфизма. В Хаскелле вон полиморфизм покруче будет, чем во всяких Явах.


P>О черт, опять этот Хаскель. И тут Хаскель, и там Хаскель, такое ощущение, что это — образец трепетного поклонения.


Чем переходить к неконструктиву, лучше бы ответил на первый вопрос. Хаскель я привёл не потому, что в нём не используется точечная нотация, но он вполне себе полиморфный; но никак не потому, что Хаскель — объект поклонения, мне вот Nemerle больше нравится. А так могу привести ещё пример — ADA95. Причём ещё в ADA83 был полиморфизм типов (aka generics), который совершенно нормально уживался с функциональной нотацией. В 95-м году были добавлены tagged types, а не точечная нотация, и эти tagged types позволили организовывать полиморфизм, про который ты говоришь.

P>При том, что один из способов реализовать некое подобие полиморфизма — это pattern matching. Другой — мультиметоды. Ни того, ни другого нет ни в Java, ни в С++. Я имею ввиду. конечно, нпсредственную поддержку языка.


Никакой полиморфизм pattern matching реализовывать не умеет. Он вообще нужен для сопоставления алгебраических типов данных.

K>>Нет, не превратится, т.к. это вообще разные вещи, предназначенные для разных вещей.


P>Это, как вы выразились, "вещи", предназначенные для других вещей, но позволяющие, пусть и разными способами, реализовать одно и то же — полиморфизм на основе типов.


... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[5]: method(obj) то же самое, что и obj.method() ? Что за
От: aka50 Россия  
Дата: 04.07.07 19:25
Оценка:
Здравствуйте, Perseus, Вы писали:

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


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


Кё>>>>Если речь идет о таком стиле кодирования — замене конструкций obj.foo(bar) на foo(obj, bar), то конечно, нет, не надо.

LP>>>Дело в том, что подобные "перлы" обычно исходячт от т н "функциональщиков", клеймящих ООП и все, что с ним связано.
A>>Функциональщики возвращают _новый_ объект, а не измененный.

P>Под измененным объектом имеется ввиду измененная КОПИЯ объекта.

Слова копия в оригинале не было.
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: aka50 Россия  
Дата: 04.07.07 19:29
Оценка:
Здравствуйте, Perseus, Вы писали:

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


Зачем же так много цитировать...

P>Ну это же, черт возьми в Лиспе. Я же говорил про языки класса C++/Java. Там, придется ограничиться if-ами, хотя есть паттерны, которые позволяют это дело сгладить.

В вопросе этого не звучало. Был просто вопрос: почему так? Я и ответил, что это вопрос языка. Тот же nice (работает на jvm) это умеет делать. Далее выше написали, что нужно хорошо думать, прежде чем пихать кучу методов в класс, если эти методы работают только с public api этого класса.
Re[5]: method(obj) то же самое, что и obj.method() ? Что за
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 04.07.07 19:42
Оценка:
Здравствуйте, Perseus, Вы писали:

P>Под измененным объектом имеется ввиду измененная КОПИЯ объекта.


Вопрос, какие могут быть копии в ФП? Вообще, какие там могут быть объекты?
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[6]: method(obj) то же самое, что и obj.method() ? Что за
От: aka50 Россия  
Дата: 04.07.07 19:50
Оценка:
Здравствуйте, konsoletyper, Вы писали:

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


P>>Под измененным объектом имеется ввиду измененная КОПИЯ объекта.


K>Вопрос, какие могут быть копии в ФП? Вообще, какие там могут быть объекты?

Ну если это jvm/net то вполне себе будут объекты . immutable, но объекты...
Re[7]: method(obj) то же самое, что и obj.method() ? Что за
От: WolfHound  
Дата: 04.07.07 22:23
Оценка:
Здравствуйте, aka50, Вы писали:

K>>Вопрос, какие могут быть копии в ФП? Вообще, какие там могут быть объекты?

A>Ну если это jvm/net то вполне себе будут объекты . immutable, но объекты...
Детали реализации однако. Если мы конечно говорим о чистом ФЯ.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: IB Австрия http://rsdn.ru
Дата: 05.07.07 07:32
Оценка:
Здравствуйте, Perseus, Вы писали:

P> Я же говорил о трансформации ООП->ФП.

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

P>Это вообще к чему?

К полиморфизму...

P>В данном случае вам придется делать ЯВНОЕ преобразование типа, те с помощью рантаймовой инфы узнавать тип объекта, делать нужный каст и вызывать нужную функцию, либо ловить ClassCastException Какой к черту полиморфизм?

Не придется. Я не зря писал про двойную диспетчерезацию и визиторы.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re[3]: method(obj) то же самое, что и obj.method() ? Что за
От: dr.Chaos Россия Украшения HandMade
Дата: 05.07.07 07:48
Оценка:
Здравствуйте, Perseus, Вы писали:


LP>>>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.

IB>>Хм...
IB>>Method(A a)
IB>>Method(B b)

P>Это вообще к чему?

P>В данном случае вам придется делать ЯВНОЕ преобразование типа, те с помощью рантаймовой инфы узнавать тип объекта, делать нужный каст и вызывать нужную функцию, либо ловить ClassCastException Какой к черту полиморфизм?


Гхм... Зачем? Помнишь в С++ есть такая штука — перегрузка метода. Те типы принимаемых значений являются частью сигнатуры функции. А компилятор зная тип параметра выбирает нужную функцию. Это и есть специальный(ad hoc) полиморфизм.

Виртуальные функции обеспечивают механизм параметрического полиморфизма.

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

Было интересное обсуждение BulatZigansin довольно хорошо объяснил различие м-ду механизмом виртуальных функций и классами типов здесь
Автор: BulatZiganshin
Дата: 06.06.07
.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[7]: method(obj) то же самое, что и obj.method() ? Что за
От: Klapaucius  
Дата: 05.07.07 07:52
Оценка: :)
Здравствуйте, aka50, Вы писали:

K>>Вопрос, какие могут быть копии в ФП? Вообще, какие там могут быть объекты?

A>Ну если это jvm/net то вполне себе будут объекты . immutable, но объекты...

Сейчас, наверное, придет Gaperton и скажет, что immutable object — это оксюморон и что это никакой не объект а вовсе даже АТД.
... << RSDN@Home 1.2.0 alpha rev. 677>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[8]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 05.07.07 09:19
Оценка: -1
Здравствуйте, Klapaucius, Вы писали:

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


K>>>Вопрос, какие могут быть копии в ФП? Вообще, какие там могут быть объекты?

A>>Ну если это jvm/net то вполне себе будут объекты . immutable, но объекты...

K>Сейчас, наверное, придет Gaperton и скажет, что immutable object — это оксюморон и что это никакой не объект а вовсе даже АТД.


Строго говоря, так и есть. Объект только тогда является объектом, когда у него есть СОСТОЯНИЕ, а состояние не может быть не изменяемым. Такой "объект" может быть с легкостью заменен на функцию, возвращающей значение.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[4]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 05.07.07 09:28
Оценка:
Здравствуйте, dr.Chaos, Вы писали:

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



LP>>>>В результате при вызове метода method по интерфейсу I вызовется нужная реализация. Ничего подобного нельзя сделать с функциями.

IB>>>Хм...
IB>>>Method(A a)
IB>>>Method(B b)

P>>Это вообще к чему?

P>>В данном случае вам придется делать ЯВНОЕ преобразование типа, те с помощью рантаймовой инфы узнавать тип объекта, делать нужный каст и вызывать нужную функцию, либо ловить ClassCastException Какой к черту полиморфизм?


DC>Гхм... Зачем? Помнишь в С++ есть такая штука — перегрузка метода. Те типы принимаемых значений являются частью сигнатуры функции. А компилятор зная тип параметра выбирает нужную функцию. Это и есть специальный(ad hoc) полиморфизм.


Может, хватить путать инстанс объекта с его типом?


class A : public Interface
{
}

class B : public Interface
{
}

void foo(A* object)
{
}

void foo(B* object)
{
}

void test()
{
Interface* object1 = new A();
Interface* object2 = new B();

foo((A)object1);
foo((B)object1);
}


Компилятор требует явного приведения типов при вызове соот.в функции. Т е нужно делать dynamic cast , делать нужный каст и вызывать нужную функцию, что НИЧЕГО ОБЩЕГО С ПОЛИМОРФИЗМОМ НЕ ИМЕЕТ.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[4]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 05.07.07 09:47
Оценка:
Здравствуйте, IB, Вы писали:

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


P>> Я же говорил о трансформации ООП->ФП.

IB>Трансформация ООП->ФП, как раз и заключается в том, что все что не нужно выносится в сервисные методы.

Трансформация ООП->ФП заключается в том, что объект напрочь теряет изменяемость состояния. А раз так, НЕ МОЖЕТ БЫТЬ НИКАКИХ ВНУТРЕННИХ МЕТОДОВ, которые, пусть и локально, меняют состояние объекта. Т е все методы выносоятся из класса и объект, собственно, перестает быть объектом, поисходит потеря состояния. Почитайте про концепцию ФП.

IB>Просто ФП заставляет задуматься, действительно ли метод в классе нужн. Никто не призывает убирать из класса все, но если в процессе разборки с классом выяснилось, что методы ему не нужны, то ничего страшного в этом нет.


Почитайте про концепцию ФП.

P>>Это вообще к чему?

IB>К полиморфизму...

Я уже написал, что полиморфизма там нет. Ответ обоснован и потвержден примером.

P>>В данном случае вам придется делать ЯВНОЕ преобразование типа, те с помощью рантаймовой инфы узнавать тип объекта, делать нужный каст и вызывать нужную функцию, либо ловить ClassCastException Какой к черту полиморфизм?

IB>Не придется. Я не зря писал про двойную диспетчерезацию и визиторы.

Двойная диспетчеризация как раз позволяет реализовать перегрузку по инстансу, а не по типу. Никто не спорит, что этот паттерн позволяет эмулировать мультиметоды. Речь совсем о другом. А именно: в соответствии с концепцией ФП при таком подходе теряется понятие объекта как такового. Читайте то, чтоя написал выше.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[6]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 05.07.07 09:56
Оценка:
Здравствуйте, konsoletyper, Вы писали:

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


P>>Под измененным объектом имеется ввиду измененная КОПИЯ объекта.


K>Вопрос, какие могут быть копии в ФП? Вообще, какие там могут быть объекты?


Объектов в понимании ООП в чистом ФП в самом деле, быть не может. Но посольку я говорил о преобразовании ООП->ФП применительно к общим языкам, то "объект" в данном случае нужно понимать в "аппаратном" смысле если вы поняли, о чем я.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[9]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 05.07.07 10:06
Оценка:
Здравствуйте, LaPerouse, Вы писали:

K>>Сейчас, наверное, придет Gaperton и скажет, что immutable object — это оксюморон и что это никакой не объект а вовсе даже АТД.


LP>Строго говоря, так и есть. Объект только тогда является объектом, когда у него есть СОСТОЯНИЕ, а состояние не может быть не изменяемым. Такой "объект" может быть с легкостью заменен на функцию, возвращающей значение.


Интересно было бы посмотреть, как заменить immutable строку (считаную например с консоли) на функцию.

GoJanus для FireFox
Re[5]: method(obj) то же самое, что и obj.method() ? Что за
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 05.07.07 10:20
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>

LP>class A : public Interface
LP>{
LP>}

LP>class B : public Interface
LP>{
LP>}

LP>void foo(A* object)
LP>{
LP>}

LP>void foo(B* object)
LP>{
LP>}

LP>void test()
LP>{
LP>Interface* object1 = new A();
LP>Interface* object2 = new B();

LP>foo((A)object1);
LP>foo((B)object1);
LP>}
LP>


LP>Компилятор требует явного приведения типов при вызове соот.в функции. Т е нужно делать dynamic cast , делать нужный каст и вызывать нужную функцию, что НИЧЕГО ОБЩЕГО С ПОЛИМОРФИЗМОМ НЕ ИМЕЕТ.


Блин, непонятно, зачем ты заладил этот спор. Никто в C++ или Java использовать функциональную нотацию вместо точечной не заставляет. А вот некоторых других языках точечной нотации просто нет, но там использование функциональной нотации не приводит к описанной проблеме. Когда люди говорят про скобочную нотацию, они эти самые языки и имеют в виду.
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[5]: method(obj) то же самое, что и obj.method() ? Что за
От: dr.Chaos Россия Украшения HandMade
Дата: 05.07.07 10:45
Оценка:
Здравствуйте, LaPerouse, Вы писали:

DC>>Гхм... Зачем? Помнишь в С++ есть такая штука — перегрузка метода. Те типы принимаемых значений являются частью сигнатуры функции. А компилятор зная тип параметра выбирает нужную функцию. Это и есть специальный(ad hoc) полиморфизм.


LP>Может, хватить путать инстанс объекта с его типом?


LP>

LP>class A : public Interface
LP>{
LP>}

LP>class B : public Interface
LP>{
LP>}

LP>void foo(A* object)
LP>{
LP>}

LP>void foo(B* object)
LP>{
LP>}

LP>void test()
LP>{
LP>Interface* object1 = new A();
LP>Interface* object2 = new B();

LP>foo((A)object1);
LP>foo((B)object1);
LP>}
LP>


LP>Компилятор требует явного приведения типов при вызове соот.в функции. Т е нужно делать dynamic cast , делать нужный каст и вызывать нужную функцию, что НИЧЕГО ОБЩЕГО С ПОЛИМОРФИЗМОМ НЕ ИМЕЕТ.


Ты внимательно прочел что я тебе написал? В случае перегрузки мы имеет 2 сигнатуры функции для разных типов, но имя функции одно и получается что одна функция работает для разных типов, т.е. ведет себя полиморфно. В случае с шаблонами во время компиляции просто генерируется нужная сигнатура на этапе компиляции.

Когда ты передал туда укзатель на интерфейс, ты подразумеваешь не конкретный тип а целое семейство типов, которые обладают общим интерфейсом. Функция работает для этого семейства типов, т.е. ведет себя полиморфно.

А как это сделано, через виртуальные функции или еще как, деталь реализации конкретного инструмента (языка).

ЗЫ Складывается впечатление, что ты считаешь полиморфизмом одну из его реализации.
ЗЫЫ По ссылке ходил?
ЗЫЫ Кроме того ты сам подумай зачем городить такую иерархию с интерфейсом, если все равно работаешь с конкретным типов в итоге? Пример синтетический и ИМХО противоречит использованию foo полиморфно.
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[5]: method(obj) то же самое, что и obj.method() ? Что за
От: IB Австрия http://rsdn.ru
Дата: 05.07.07 10:48
Оценка: +2
Здравствуйте, LaPerouse, Вы писали:

LP>Трансформация ООП->ФП заключается в том, что объект напрочь теряет изменяемость состояния.

Такое впечатление, что ты себе вбил в голову какую-то "трансформацию" и теперь пытаешься ее оспорить. В чем проблема-то?

LP>А раз так, НЕ МОЖЕТ БЫТЬ НИКАКИХ ВНУТРЕННИХ МЕТОДОВ, которые, пусть и локально, меняют состояние объекта.

Не ори, если класс получился таким, что в нем не оказалось методов, то, повторюсь, ничего страшного в этом нет.

LP> Т е все методы выносоятся из класса и объект, собственно, перестает быть объектом, поисходит потеря состояния.

LP> Почитайте про концепцию ФП.
Почитай про концепцию ООП. В кратце, суть в следующем: Есть объекты, для изменения состояния объекты обмениваются сообщениями, те самые "объяеты" с фиксированным состоянием и отсутствием методов и есть "сообщения", которыми объекты обмениваются. Та же конструкция, только в профиль, что тебя здесь пугает?

LP>Я уже написал, что полиморфизма там нет. Ответ обоснован и потвержден примером.

Каким примером? "В данном случае вам придется делать ЯВНОЕ преобразование типа..." — весь твой пример.
Так вот, не придется.

LP>Двойная диспетчеризация как раз позволяет реализовать перегрузку по инстансу, а не по типу.

Ну здрасьте...

LP>Никто не спорит, что этот паттерн позволяет эмулировать мультиметоды. Речь совсем о другом.

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

LP> А именно: в соответствии с концепцией ФП при таком подходе теряется понятие объекта как такового.

Ничего не теряется. Просто ООП несколько шире чем ты привык думать... Это все-таки больше подход к роектированию, чем просто классы с методами.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Мы уже победили, просто это еще не так заметно...
Re[10]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 05.07.07 10:50
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

LP>>Строго говоря, так и есть. Объект только тогда является объектом, когда у него есть СОСТОЯНИЕ, а состояние не может быть не изменяемым. Такой "объект" может быть с легкостью заменен на функцию, возвращающей значение.


SJA>Интересно было бы посмотреть, как заменить immutable строку (считаную например с консоли) на функцию.


Вы это к рантайму прикопались? Если это так, то никто не мешает генерить функцию в рантайме. Суть ведь совсем не в низкоуровневой реализации процесса. Суть в определении понятия состояния.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[6]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 05.07.07 11:09
Оценка:
Здравствуйте, dr.Chaos, Вы писали:

DC>Ты внимательно прочел что я тебе написал? В случае перегрузки мы имеет 2 сигнатуры функции для разных типов, но имя функции одно и получается что одна функция работает для разных типов, т.е. ведет себя полиморфно. В случае с шаблонами во время компиляции просто генерируется нужная сигнатура на этапе компиляции.


DC>Когда ты передал туда укзатель на интерфейс, ты подразумеваешь не конкретный тип а целое семейство типов, которые обладают общим интерфейсом. Функция работает для этого семейства типов, т.е. ведет себя полиморфно.


Ну сколько можно... То, очем ты говоришь, работает, если ТИП объекта СОВПАДАЕТ с его ЭКЗЕМПЛЯРОМ. Но и не это главное. Главное — то, что эти две функции — совершенно разные, у них сигнатура разная и говорить о том, что у тебя там полиморфизм смешно. Т к к ним применяются аргументы совершенно разных типов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[7]: method(obj) то же самое, что и obj.method() ? Что за
От: dr.Chaos Россия Украшения HandMade
Дата: 05.07.07 11:12
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Здравствуйте, dr.Chaos, Вы писали:


DC>>Ты внимательно прочел что я тебе написал? В случае перегрузки мы имеет 2 сигнатуры функции для разных типов, но имя функции одно и получается что одна функция работает для разных типов, т.е. ведет себя полиморфно. В случае с шаблонами во время компиляции просто генерируется нужная сигнатура на этапе компиляции.


DC>>Когда ты передал туда укзатель на интерфейс, ты подразумеваешь не конкретный тип а целое семейство типов, которые обладают общим интерфейсом. Функция работает для этого семейства типов, т.е. ведет себя полиморфно.


LP>Ну сколько можно... То, очем ты говоришь, работает, если ТИП объекта СОВПАДАЕТ с его ЭКЗЕМПЛЯРОМ. Но и не это главное. Главное — то, что эти две функции — совершенно разные, у них сигнатура разная и говорить о том, что у тебя там полиморфизм смешно. Т к к ним применяются аргументы совершенно разных типов.


Тогда ответь пожалуйста, что такое полиморфизм. Своими словами в вики не лезть .
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[2]: method(obj) то же самое, что и obj.method()?
От: Klapaucius  
Дата: 05.07.07 12:06
Оценка:
Здравствуйте, konsoletyper, Вы писали:

K>А при чём тут pattern matchin?


Об этом, в свое время, если мне память не изменяет, много говорилось здесь
Автор: Курилка
Дата: 22.10.04
... << RSDN@Home 1.2.0 alpha rev. 677>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[11]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 05.07.07 12:21
Оценка:
Здравствуйте, LaPerouse, Вы писали:

SJA>>Интересно было бы посмотреть, как заменить immutable строку (считаную например с консоли) на функцию.


LP>Вы это к рантайму прикопались? Если это так, то никто не мешает генерить функцию в рантайме. Суть ведь совсем не в низкоуровневой реализации процесса. Суть в определении понятия состояния.


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

GoJanus для FireFox
Re[8]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 05.07.07 19:22
Оценка: -4
Здравствуйте, dr.Chaos, Вы писали:

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


LP>>Здравствуйте, dr.Chaos, Вы писали:


DC>>>Ты внимательно прочел что я тебе написал? В случае перегрузки мы имеет 2 сигнатуры функции для разных типов, но имя функции одно и получается что одна функция работает для разных типов, т.е. ведет себя полиморфно. В случае с шаблонами во время компиляции просто генерируется нужная сигнатура на этапе компиляции.


DC>>>Когда ты передал туда укзатель на интерфейс, ты подразумеваешь не конкретный тип а целое семейство типов, которые обладают общим интерфейсом. Функция работает для этого семейства типов, т.е. ведет себя полиморфно.


LP>>Ну сколько можно... То, очем ты говоришь, работает, если ТИП объекта СОВПАДАЕТ с его ЭКЗЕМПЛЯРОМ. Но и не это главное. Главное — то, что эти две функции — совершенно разные, у них сигнатура разная и говорить о том, что у тебя там полиморфизм смешно. Т к к ним применяются аргументы совершенно разных типов.


DC>Тогда ответь пожалуйста, что такое полиморфизм. Своими словами в вики не лезть .


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

Вот кусок примера, который я приводил выше:

Interface* object1 = new A();
Interface* object2 = new B();

foo((A)object1);
foo((B)object2);

Какой тип у object1? Interface! Какой же экзепляр соответсвует object1 на этапе выполнения? A! (в смысле экземпляр класса А). Компилятор подбирает сответствующую сигнатуру по ТИПУ объекта. Твоя проблема в том, что ты не понимаешь, что foo(A* a) и foo(B* a) — совершенно разные функции, и поиск нужной сигнатуры при вызове ничем не отличается от вызова любой другой ф-ции. Тебя смущает одинаковые название ТЕЛА этих ф-ций. А между прочим, компилятору реально пофиг на тело, он отличает ф-ции только по сигнатуре. Предположим, мы назвали наши ф-ции по-разному

foo1(A* a)
foo2(B* a)

Тогда вызов foo1(new A()) ты тоже сочтешь полиморфным?

Тебе, очевидно, привденный выше пример представился в таком свете:

A* object1 = new A();
B* object2 = new B();

foo(object1);
foo(object2);

Вот тут, действительно, компилятор выберет нужную сигнатуру, только это не будет связано ни с каким полиморфизмом. Это будет связано банально с совпадением сигнатур, не более того Совпадение имен ф-ций как раз тебя и запутало.

В случае с виртуальными ф-циями, их сигнатуры совпадают. Как же компилятор находит нужную реализацию для вызова? Очень просто, используя информацию времени выполнения о КЛАССЕ, которому принадлежит ЭКЗЕМПЛЯР объекта.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 05.07.07 19:25
Оценка:
Опять же, сегодня, как и вчера Perseus — это LaPerouse. Извините за такую неувязку, так получилось, что на работе и дома разные аккаунты.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[12]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 05.07.07 19:37
Оценка: +1 :)
Здравствуйте, Sergey J. A., Вы писали:

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


SJA>>>Интересно было бы посмотреть, как заменить immutable строку (считаную например с консоли) на функцию.


LP>>Вы это к рантайму прикопались? Если это так, то никто не мешает генерить функцию в рантайме. Суть ведь совсем не в низкоуровневой реализации процесса. Суть в определении понятия состояния.


SJA>Я собственно не вижу причин почему объекты с состоянием нельзя хранить в виде ф-ий.


Прямо фантастика какая-то в стиле Г. Лавкрафта.
Как же это выглядит, если не секрет?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: method(obj) то же самое, что и obj.method() ? Что за
От: Курилка Россия http://kirya.narod.ru/
Дата: 05.07.07 19:40
Оценка: +3
Здравствуйте, Perseus, Вы писали:


P>Вот кусок примера, который я приводил выше:


P>Interface* object1 = new A();

P>Interface* object2 = new B();

P>foo((A)object1);

P>foo((B)object2);

P>Какой тип у object1? Interface! Какой же экзепляр соответсвует object1 на этапе выполнения? A! (в смысле экземпляр класса А). Компилятор подбирает сответствующую сигнатуру по ТИПУ объекта. Твоя проблема в том, что ты не понимаешь, что foo(A* a) и foo(B* a) — совершенно разные функции, и поиск нужной сигнатуры при вызове ничем не отличается от вызова любой другой ф-ции. Тебя смущает одинаковые название ТЕЛА этих ф-ций. А между прочим, компилятору реально пофиг на тело, он отличает ф-ции только по сигнатуре. Предположим, мы назвали наши ф-ции по-разному


По-моему ты запутался, Interface* — это тип указателя/ссылки, когда как у объекта, на который этот указатель/ссылка указывает, тип будет A. В традиционных языках нет диспетчеризации в рантайме по параметрам функции (в отличие, от лиспа, к примеру) и единственный метод — vtbl, но есть перегрузка, т.е. диспетчеризация времени компиляции, а там известен лишь тип ссылок, а не "живых" объектов. Ну а vtbl есть лишь один метод перегрузки, причём самый, имхо, простой, понятный, ну и эффективный.
Re[10]: method(obj) то же самое, что и obj.method() ? Что за
От: Perseus  
Дата: 05.07.07 19:45
Оценка:
Здравствуйте, Курилка, Вы писали:

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



P>>Вот кусок примера, который я приводил выше:


P>>Interface* object1 = new A();

P>>Interface* object2 = new B();

P>>foo((A)object1);

P>>foo((B)object2);

P>>Какой тип у object1? Interface! Какой же экзепляр соответсвует object1 на этапе выполнения? A! (в смысле экземпляр класса А). Компилятор подбирает сответствующую сигнатуру по ТИПУ объекта. Твоя проблема в том, что ты не понимаешь, что foo(A* a) и foo(B* a) — совершенно разные функции, и поиск нужной сигнатуры при вызове ничем не отличается от вызова любой другой ф-ции. Тебя смущает одинаковые название ТЕЛА этих ф-ций. А между прочим, компилятору реально пофиг на тело, он отличает ф-ции только по сигнатуре. Предположим, мы назвали наши ф-ции по-разному


К>По-моему ты запутался, Interface* — это тип указателя/ссылки, когда как у объекта, на который этот указатель/ссылка указывает, тип будет A.


Можно сказать и так. Неужели неочевидно равнозначность сказанного мной и вот этого утверждения. котрое представляет собой простую переформулировку? Тип объекта = типу ссылки. Само собой, РЕАЛЬНЫЙ тип объекта не имеет с эти ничего общего.

К>В традиционных языках нет диспетчеризации в рантайме по параметрам функции (в отличие, от лиспа, к примеру) и единственный метод — vtbl, но есть перегрузка, т.е. диспетчеризация времени компиляции, а там известен лишь тип ссылок, а не "живых" объектов. Ну а vtbl есть лишь один метод перегрузки, причём самый, имхо, простой, понятный, ну и эффективный.


Само собой. Что ты хотел этим сказать?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: method(obj) то же самое, что и obj.method() ? Что за
От: Курилка Россия http://kirya.narod.ru/
Дата: 05.07.07 20:36
Оценка:
Здравствуйте, Perseus, Вы писали:

P>Можно сказать и так. Неужели неочевидно равнозначность сказанного мной и вот этого утверждения. котрое представляет собой простую переформулировку? Тип объекта = типу ссылки. Само собой, РЕАЛЬНЫЙ тип объекта не имеет с эти ничего общего.


Нет, ты вот придумал какой-то "реальный" тип, а уже если у тебя своя собственная терминология, то обсуждать что-либо неинтересно, да и вообще смысла твоих претензий не просматривается (или ты что-то другое на системах типов вытеснить хочешь?). К примеру, возьмём любой динамический ООП язык — какого типа там будет ссылка? Как-то ты ограниченно смотришь, по-моему.
Re[13]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 06.07.07 08:19
Оценка:
Здравствуйте, Perseus, Вы писали:

SJA>>Я собственно не вижу причин почему объекты с состоянием нельзя хранить в виде ф-ий.


P>Прямо фантастика какая-то в стиле Г. Лавкрафта.

P>Как же это выглядит, если не секрет?

В виде списка ф-ий, что-то делающих с immutable объектом и возвращающих новый immutable объект. Изменение состояния объекта будет сводится к добавлению ф-ии, принимающей как аргумент предыдущую ф-ию, и параметры требуемые для модификации в конец списка ф-ий.

f = [foo]    // возвращает результат работы ф-ии foo. Например строку "foo"
приведение к верхнему регистру:
f = [foo, upper]
добавление строки "bar" (представленной ф-ией bar) в виде каррированой ф-ии concat(x, y) { return x + y };
f = [foo, upper, lambda x: concat (x bar())]


и т.д. текущее состояние получается путём выполнения всех ф-ий по списку.

GoJanus для FireFox
Re[9]: method(obj) то же самое, что и obj.method() ? Что за
От: dr.Chaos Россия Украшения HandMade
Дата: 06.07.07 08:41
Оценка:
Здравствуйте, Perseus, Вы писали:

DC>>Тогда ответь пожалуйста, что такое полиморфизм. Своими словами в вики не лезть .


P>Полиморфизм в применении к ООП — это свойство объектов реагировать по-разному на одно и то же входное воздействие.


В приведенном примере кто ведет себя полиморфно? Правильно параметр функции указатель на интерфейс, но никак не объект. И такой полиморфизм (параметрический) обеспечивается механизмом виртуальных функций. Ты все верно объяснил, как это реализовано в С++. Но замена obj.metod() на metod(obj) в плане полиморфизма ничего не меняет, просто С++ не умеет разруливать такие ситуации. (Есть языки, которые это умеют точно знаю умеет Хаскел. Ссылку я тебе давал.) То что подобная замена лишена смысла в таких языка, думаю очевидно, т.к. придеться делать полиморфное поведение ручками .

А сейчас я объясню более подробно, какую логическую ошибку совершаешь ты.

Я пытаюсь тебе объяснить, что ты прицепился к конкретной реализации полиморфизма в конкретном языке и не до конца понимаешь его смысл.

P>Вот кусок примера, который я приводил выше:


P>Interface* object1 = new A();

P>Interface* object2 = new B();

P>foo((A)object1);

P>foo((B)object2);

P>Какой тип у object1? Interface! Какой же экзепляр соответсвует object1 на этапе выполнения? A! (в смысле экземпляр класса А). Компилятор подбирает сответствующую сигнатуру по ТИПУ объекта. Твоя проблема в том, что ты не понимаешь, что foo(A* a) и foo(B* a) — совершенно разные функции, и поиск нужной сигнатуры при вызове ничем не отличается от вызова любой другой ф-ции. Тебя смущает одинаковые название ТЕЛА этих ф-ций. А между прочим, компилятору реально пофиг на тело, он отличает ф-ции только по сигнатуре. Предположим, мы назвали наши ф-ции по-разному


P>foo1(A* a)

P>foo2(B* a)

Вот тут я немного добавлю, полиморфным может быть не только интерфейс, а еще и функция!!!! Ты же считаешь нормальным что оператор '+' складывает различные типы чисел. Т.е. для разных типов функция ведет себя по разному, т.е. полиморфна, для программиста сущность 'функция' определяется её именем. Посему вызовы sqrt(12) и sqrt(12.0) мы считаем вызовами одной функции (квадрат возвращает в любом случае), но для разных типов поведение этой
функции совершенно разное. Т.е. функция ведет себя полиморфно.

P>Тогда вызов foo1(new A()) ты тоже сочтешь полиморфным?


Нет, функция то другая даже имя не то . Это для компилятора foo(A*) и foo(B*) разные функции, для меня это одна функция, т.к. делает она одно и тоже действие только с разными типами.

P>Тебе, очевидно, привденный выше пример представился в таком свете:


P>A* object1 = new A();

P>B* object2 = new B();

P>foo(object1);

P>foo(object2);

P>Вот тут, действительно, компилятор выберет нужную сигнатуру, только это не будет связано ни с каким полиморфизмом. Это будет связано банально с совпадением сигнатур, не более того Совпадение имен ф-ций как раз тебя и запутало.


Меня ничего не запутало, я просто сначала не понял что ты так пытался изобразить.

P>В случае с виртуальными ф-циями, их сигнатуры совпадают. Как же компилятор находит нужную реализацию для вызова? Очень просто, используя информацию времени выполнения о КЛАССЕ, которому принадлежит ЭКЗЕМПЛЯР объекта.


Погоди а как компилятор узнает информацию времени выполнения? Он же не выполняет программу . Компилятор видит только vtbl, что является информацией о типе (весьма ограниченной), но времени компиляции .
Побеждающий других — силен,
Побеждающий себя — Могущественен.
Лао Цзы
Re[10]: method(obj) то же самое, что и obj.method() ? Что за
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.07.07 08:50
Оценка:
Здравствуйте, Sergey J. A., Вы писали:
SJA>Интересно было бы посмотреть, как заменить immutable строку (считаную например с консоли) на функцию.
Как раз это — элементарно. Смотря что ты ожидаешь от строки. Например, можно представить строку как функцию, которая возвращает пару из (текущий символ, остаток строки), где остаток строки — такая же (по устройству) функция, либо null если символ был последним.
При вводе строки с консоли мы тупо строим дерево функций:
{ return ('h', {return ('e', {return ('l', {return ('l', {return ('o', null)})})})})}

Всё.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[11]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 06.07.07 08:58
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Sergey J. A., Вы писали:

SJA>>Интересно было бы посмотреть, как заменить immutable строку (считаную например с консоли) на функцию.
S>Как раз это — элементарно. Смотря что ты ожидаешь от строки. Например, можно представить строку как функцию, которая возвращает пару из (текущий символ, остаток строки), где остаток строки — такая же (по устройству) функция, либо null если символ был последним.
S>При вводе строки с консоли мы тупо строим дерево функций:
S>
S>{ return ('h', {return ('e', {return ('l', {return ('l', {return ('o', null)})})})})}
S>

S>Всё.

А что нам в таком случае помешает тупо достраивать дерево ф-ий, что-бы представить модификацию этой строки и далее ?

GoJanus для FireFox
Re[14]: method(obj) то же самое, что и obj.method() ? Что за
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.07.07 09:07
Оценка:
Здравствуйте, Sergey J. A., Вы писали:
SJA>и т.д. текущее состояние получается путём выполнения всех ф-ий по списку.
Это будет другой объект. Существующие ссылки на старый объект никак не затронутся. В этом, собственно, одно из основных отличий ООП от ФП: в ООП мы можем передать объекту1 ссылку на объект2; объект1 будет регулярно "дергать" объект2 для каких-то своих целей. Затем внеший по отношению к объекту1 код может изменить состояние объекта2, и объект1 будет наблюдать другое поведение от того же самого объекта2. В ФП для этого потребуется создать объект1', который будет содержать ссылку на совсем другой объект2'.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[15]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 06.07.07 09:14
Оценка:
Здравствуйте, Sinclair, Вы писали:

SJA>>и т.д. текущее состояние получается путём выполнения всех ф-ий по списку.

S>Это будет другой объект. Существующие ссылки на старый объект никак не затронутся. В этом, собственно, одно из основных отличий ООП от ФП: в ООП мы можем передать объекту1 ссылку на объект2; объект1 будет регулярно "дергать" объект2 для каких-то своих целей. Затем внеший по отношению к объекту1 код может изменить состояние объекта2, и объект1 будет наблюдать другое поведение от того же самого объекта2. В ФП для этого потребуется создать объект1', который будет содержать ссылку на совсем другой объект2'.

Вообще-то в моём примере изменяется список, но голова списка остаётся по одному и тому-же адресу. Этот адрес можно пеердать куда угодно. Причём при каждом доступе к объекту он должен пересоздаться заново (в коде приложения нельзя создать объект из ф-ии и сохранить на него ссылку).

GoJanus для FireFox
Re[12]: method(obj) то же самое, что и obj.method() ? Что за
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.07.07 09:41
Оценка:
Здравствуйте, Sergey J. A., Вы писали:
SJA>А что нам в таком случае помешает тупо достраивать дерево ф-ий, что-бы представить модификацию этой строки и далее ?
То, что существующие указатели на эту строку никак не изменятся. Нельзя сделать из этой строки hello world, потому, что научить пятую функцию возвращать вместо ('o', null) что-то другое — нельзя. Это не объект, это неизменная функция.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[13]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 06.07.07 09:48
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>То, что существующие указатели на эту строку никак не изменятся. Нельзя сделать из этой строки hello world, потому, что научить пятую функцию возвращать вместо ('o', null) что-то другое — нельзя. Это не объект, это неизменная функция.


А если хранить указатель на указатель на ф-цию ? Тогда привешивание доп. ф-ий повлияет на все указатели.

GoJanus для FireFox
Re[16]: method(obj) то же самое, что и obj.method() ? Что за
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.07.07 09:58
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

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


SJA>>>и т.д. текущее состояние получается путём выполнения всех ф-ий по списку.

S>>Это будет другой объект. Существующие ссылки на старый объект никак не затронутся. В этом, собственно, одно из основных отличий ООП от ФП: в ООП мы можем передать объекту1 ссылку на объект2; объект1 будет регулярно "дергать" объект2 для каких-то своих целей. Затем внеший по отношению к объекту1 код может изменить состояние объекта2, и объект1 будет наблюдать другое поведение от того же самого объекта2. В ФП для этого потребуется создать объект1', который будет содержать ссылку на совсем другой объект2'.

SJA>Вообще-то в моём примере изменяется список, но голова списка остаётся по одному и тому-же адресу.

Этого не может быть.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: method(obj) то же самое, что и obj.method() ? Что за
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.07.07 10:01
Оценка: +1
Здравствуйте, Sergey J. A., Вы писали:

SJA>А если хранить указатель на указатель на ф-цию ? Тогда привешивание доп. ф-ий повлияет на все указатели.

Что ты понимаешь под словом "привешивание"? Подумай внимательнее, и учти, что никаких модификаций у существующих структур/функций нет. "Добавление" в голову списка в ФП ничего на самом деле не добавляет; создается новый список, который ссылается на старый.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[15]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 06.07.07 10:58
Оценка: -1
Здравствуйте, Sergey J. A., Вы писали:

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


SJA>>>и т.д. текущее состояние получается путём выполнения всех ф-ий по списку.

S>>Это будет другой объект. Существующие ссылки на старый объект никак не затронутся. В этом, собственно, одно из основных отличий ООП от ФП:

Я бы сказал даже, что это единственное СУЩЕСТВЕННОЕ отличие ФП от процедурного программирования. Все остальное — рюшечки да шашечки, прямого отношения к ФП не имеющиеся. Те же замыкания — это хак для ФП, прямо нарушающий идеи ФП, чтобы с помощью ФП можно было написать что-нибудь поболее HelloWorld. То же самое можно сказать и про полиморфизм — это чрезвычайно полезная вещь для языков ФП, но вещь, прямого отношения к ФП не имеющая. А то, что существует привычка рассуждения "то что есть в языках ФП, то и есть ФП", — это факт общеизвестный, но нас-то не проведешь Те же лямбды существуют везде, где только можно, в Smalltalk — это codeblock, например. И их наличие никак не говорит о том, что это является признаком "функциональности" языка.

Все так называемые "достоинства функционального программирования" проистекают из-за принципиального отказа от хранения состояния. Это и некоторая декларативность и отсутствие необходимости придерживаться порядка вычислений. А большинство остальных отличий ФП — это попытки сгладить негативные последствия пункта 1.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[16]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 06.07.07 10:59
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

SJA>Вообще-то в моём примере изменяется список, но голова списка остаётся по одному и тому-же адресу. Этот адрес можно пеердать куда угодно. Причём при каждом доступе к объекту он должен пересоздаться заново (в коде приложения нельзя создать объект из ф-ии и сохранить на него ссылку).


Списки вообще-то тоже должны быть immutable.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[16]: method(obj) то же самое, что и obj.method() ? Что за
От: Sinclair Россия https://github.com/evilguest/
Дата: 06.07.07 11:09
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Я бы сказал даже, что это единственное СУЩЕСТВЕННОЕ отличие ФП от процедурного программирования.

Ну, я как-то стесняюсь назвать построение функций на лету несущественным Лямбды шарпа и анонимные классы не считаются, они как бы заранее один раз построены при компиляции. Рефлексия не считается — это не часть языка, то же самое, что вызвать внешний компилятор. Других существенных отличий именно ФП от ООП я и не знаю.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[17]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 06.07.07 11:13
Оценка:
Здравствуйте, Sinclair, Вы писали:

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


LP>>Я бы сказал даже, что это единственное СУЩЕСТВЕННОЕ отличие ФП от процедурного программирования.

S>Ну, я как-то стесняюсь назвать построение функций на лету несущественным Лямбды шарпа и анонимные классы не считаются, они как бы заранее один раз построены при компиляции.

Это опять-таки особенность реализации. Пусть и является хлебом и водой при программмировании на функциональном языке.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[16]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 06.07.07 11:36
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Здравствуйте, Sergey J. A., Вы писали:


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


SJA>>>>и т.д. текущее состояние получается путём выполнения всех ф-ий по списку.

S>>>Это будет другой объект. Существующие ссылки на старый объект никак не затронутся. В этом, собственно, одно из основных отличий ООП от ФП:

LP>Я бы сказал даже, что это единственное СУЩЕСТВЕННОЕ отличие ФП от процедурного программирования. Все остальное — рюшечки да шашечки, прямого отношения к ФП не имеющиеся. Те же замыкания — это хак для ФП, прямо нарушающий идеи ФП, чтобы с помощью ФП можно было написать что-нибудь поболее HelloWorld. То же самое можно сказать и про полиморфизм — это чрезвычайно полезная вещь для языков ФП, но вещь, прямого отношения к ФП не имеющая. А то, что существует привычка рассуждения "то что есть в языках ФП, то и есть ФП", — это факт общеизвестный, но нас-то не проведешь Те же лямбды существуют везде, где только можно, в Smalltalk — это codeblock, например. И их наличие никак не говорит о том, что это является признаком "функциональности" языка.


Здрасьте! ФЯ и есть засахаренная лямбда. Лямбда-исчисление (или комбинаторное — они эквивалентны) — это и есть ассемблер для ФП. А про полиморфизм — никто и не утверждал, что это свойство исключительно ФП. Просто канонический ООП-полиморфизм — один из частных случаев полиморфизма в широком смысле: когда одна и та же синтаксическая конструкция годна для разных типов.

LP>Все так называемые "достоинства функционального программирования" проистекают из-за принципиального отказа от хранения состояния. Это и некоторая декларативность и отсутствие необходимости придерживаться порядка вычислений. А большинство остальных отличий ФП — это попытки сгладить негативные последствия пункта 1.


Современные ФЯ позволяют хранить состояния, не нарушая чистоты. Вопрос их изоляции решается, например, с помощью системы типов. Просто состояние — не предмет первой необходимости при функциональном подходе.
Re[17]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 06.07.07 11:47
Оценка: :)
Здравствуйте, deniok, Вы писали:

D>Современные ФЯ позволяют хранить состояния, не нарушая чистоты. Вопрос их изоляции решается, например, с помощью системы типов. Просто состояние — не предмет первой необходимости при функциональном подходе.


Нет. Не существует такого способа хранить состояние и при этом избежать side-эффектов. Не хотите же вы привести монады из Haskell, которые являются чистым костылем к оригинальному ФП?
Опять-таки, расхождение в терминологии. Вы под ФП, по всей видимости, имеете ввиду то, что реализовано в современных ФЯ. Я же под ФП понимаю его первоначальную трактовку, которая как раз начисто отрицает всякое состояние.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[17]: method(obj) то же самое, что и obj.method() ? Что за
От: Трурль  
Дата: 06.07.07 11:48
Оценка:
Здравствуйте, deniok, Вы писали:

D>Здрасьте! ФЯ и есть засахаренная лямбда.

Как известно по крайней мере с 1965 года, практически любой ЯП есть засахаренная лямбда.
Re[17]: method(obj) то же самое, что и obj.method() ? Что за
От: Трурль  
Дата: 06.07.07 11:58
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Лямбды шарпа и анонимные классы не считаются

А процедуры Алгола-68?
Re[18]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 06.07.07 12:05
Оценка:
Здравствуйте, Трурль, Вы писали:

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


D>>Здрасьте! ФЯ и есть засахаренная лямбда.

Т>Как известно по крайней мере с 1965 года, практически любой ЯП есть засахаренная лямбда.

Эквивалентен — да. Является — нет. (Я про чистые ФЯ говорю.) Всякие комбинаторные редукции затруднены для языков, непосредственно апеллирующих к тьюринговой архитектуре вычислителя.
Re[18]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 06.07.07 12:19
Оценка: +1
Здравствуйте, LaPerouse, Вы писали:

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


D>>Современные ФЯ позволяют хранить состояния, не нарушая чистоты. Вопрос их изоляции решается, например, с помощью системы типов. Просто состояние — не предмет первой необходимости при функциональном подходе.


LP>Нет. Не существует такого способа хранить состояние и при этом избежать side-эффектов. Не хотите же вы привести монады из Haskell, которые являются чистым костылем к оригинальному ФП?


Какой костыль? С помощью компактно и математически строго заданной системы типов монтируется языковая конструкция, позволяющая ввести в язык состояние. Монада — это не что-то приделанное к языку сбоку. Это просто один из "интерфейсов" (классов типов), которые реализован на самом языке. Фактически монады — это просто сделанный на самом языке DSL, позволяющий монтировать цепочки вычислений с унифицированным неявным протаскиванием любой доп.информации вдоль цепочки.

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


А под ООП? Тогда уж давай говорить, что ООП — это объекты с состоянием, обменивающиеся сообщениями и ничего больше. Идея очень плодотворная, но все другие, более поздние идеи, при таком подходе, к ООП отношения не имеют.
Re[15]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 06.07.07 12:23
Оценка:
Здравствуйте, Sinclair, Вы писали:

SJA>>А если хранить указатель на указатель на ф-цию ? Тогда привешивание доп. ф-ий повлияет на все указатели.

S>Что ты понимаешь под словом "привешивание"? Подумай внимательнее, и учти, что никаких модификаций у существующих структур/функций нет.

Но на уровне рантайма модификации то могут быть ? Вот пусть компилятор транслирует "указатель на объект" в программе на указатель на указатель на функцию в реальном коде.
А применнеие ф-ии к объекту транслирует в добавление ф-ии в этот список. При этом меняется только указатель на ф-ию.

GoJanus для FireFox
Re[17]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 06.07.07 12:23
Оценка:
Здравствуйте, LaPerouse, Вы писали:

SJA>>Вообще-то в моём примере изменяется список, но голова списка остаётся по одному и тому-же адресу. Этот адрес можно пеердать куда угодно. Причём при каждом доступе к объекту он должен пересоздаться заново (в коде приложения нельзя создать объект из ф-ии и сохранить на него ссылку).


LP>Списки вообще-то тоже должны быть immutable.


Этот список не виден приложению, и изменяется фреймворком.
Так же как Haskell не видит десктруктивного присваивания регистру eax

GoJanus для FireFox
Re[19]: method(obj) то же самое, что и obj.method() ? Что за
От: Трурль  
Дата: 06.07.07 12:30
Оценка:
Здравствуйте, deniok, Вы писали:

D>Эквивалентен — да. Является — нет.


Боюсь, я недостаточно подкован, для философкой дискуссии о тождественности и эквивалентности.
Re[20]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 06.07.07 13:35
Оценка:
Здравствуйте, Трурль, Вы писали:

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


D>>Эквивалентен — да. Является — нет.


Т>Боюсь, я недостаточно подкован, для философкой дискуссии о тождественности и эквивалентности.


Ну я далёк от абстрактных философствований

Я имел в виду лишь тот тот факт, что переменные, которые у нас имеются в лямбда-исчислении, например x y и z в
\x y z -> x (y x)

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

А по вычислительной мощности оба подхода эквивалентны (ты это имел ввиду, говоря про 1965 год?). Но детали архитектуры вычислителя и способы работы с ним — весьма различаются. И чистый ФП-подход как раз существенным образом основан на оптимизациях, связанных с редукциями лямбда-термов.
Re[19]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 07.07.07 10:20
Оценка: -2 :)
Скажите, возможно ли в Haskell определить типы, которые рекурсивно содержат друг друга?

К примеру, нечто такое

class A
{
int state;
A child = new A();
ArrayList<A> childs = new ArrayList<A>();
}


D>А под ООП? Тогда уж давай говорить, что ООП — это объекты с состоянием, обменивающиеся сообщениями и ничего больше.


Все верно. Имеются общеивестные критерии ООП: инкапсуляция, полиморфизм, наследование. Из этих критериев, в частности, следует, что "объекты с состоянием, обменивающиеся сообщениями". И в этом смысле ООП он и в Африке ООП: языки, которые не поддерживают его концепции не являются ОО-языками.

D>Идея очень плодотворная, но все другие, более поздние идеи, при таком подходе, к ООП отношения не имеют.


Какие такие идеи? Я уже сказал, что существуют вполне четкие критерии, позволяющие однозначно определить, вписываются ли такие "поздние идеи", такие, наспример, как "аспекты", в формат ООП.

Впрочем, мне хотелось бы, чтобы вы сосредоточились на ответе на первый вопрос, т к остальное приведет лишь к пустопоржней болтовне, которая мне неинтересна.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[20]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 07.07.07 10:27
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Скажите, возможно ли в Haskell определить типы, которые рекурсивно содержат друг друга?


LP>К примеру, нечто такое


LP>
LP>class A
LP>{
LP>int state;
LP>A child = new A();
LP>ArrayList<A> childs = new ArrayList<A>();
LP>}
LP>


Уточню: разумеется, экземпляры дочерних типов, в отличие от Java, входят в родительский контейнер (иное противоречит идеям ФП). Т е в этом как раз смысл "соджержат друг-друга", а не "ссылаются друг на друга".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[20]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 07.07.07 12:49
Оценка: +1
Здравствуйте, LaPerouse, Вы писали:

LP>Скажите, возможно ли в Haskell определить типы, которые рекурсивно содержат друг друга?


LP>К примеру, нечто такое


LP>
LP>class A
LP>{
LP>int state;
LP>A child = new A();
LP>ArrayList<A> childs = new ArrayList<A>();
LP>}
LP>


Конечно. Рекурсивные типы данных — один из основных инструментов.

Собственно тип списка так и определяется (в Стандартных Библиотеках немножко другая терминология, но суть та же)
data List a = Nil | Cons a (List a)

Список — это полиморфный тип, поскольку тип a здесь любой (a называется переменной типа). List — это конструктор типа, он описывает общий shape этого типа (фактически — однопараметричность). Nil и Cons — это конструкторы данных, их типы:
Nil :: List a
Cons :: a -> List a -> List a

Соответственно можем конструировать
my_list = Cons 'a' (Cons 'b' (Cons 'c' Nil)) -- имеет тип List Char

В Стандартных Библиотеках Nil — это [], а Cons — это оператор (:), то есть конструирование выглядит так
my_list = 'a':'b':'c':[] -- имеет тип [Char]



А то, что ты описываешь похоже на multiway trees (rose trees), которые тоже есть в стандартных библиотеках:
data Tree a = Node {
    rootLabel :: a 
    subForest :: (Forest a) 
} 

type Forest a = [Tree a] -- список деревьев (type - это вроде C++ного typedef)

Значение state будет храниться в a, которым этот тип параметризован.
Re[20]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 07.07.07 13:02
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Все верно. Имеются общеивестные критерии ООП: инкапсуляция, полиморфизм, наследование. Из этих критериев, в частности, следует, что "объекты с состоянием, обменивающиеся сообщениями". И в этом смысле ООП он и в Африке ООП: языки, которые не поддерживают его концепции не являются ОО-языками.


D>>Идея очень плодотворная, но все другие, более поздние идеи, при таком подходе, к ООП отношения не имеют.


LP>Какие такие идеи? Я уже сказал, что существуют вполне четкие критерии, позволяющие однозначно определить, вписываются ли такие "поздние идеи", такие, наспример, как "аспекты", в формат ООП.


LP>Впрочем, мне хотелось бы, чтобы вы сосредоточились на ответе на первый вопрос, т к остальное приведет лишь к пустопоржней болтовне, которая мне неинтересна.


Я имел ввиду то, что смешно при сравнении ограничивать одну парадигму концепциями времени её зарождения, а для другой брать современное состояние. Соответственно предложил считать, что ООП == Simula 67 (например). Это была шутка.
Re[20]: method(obj) то же самое, что и obj.method() ? Что за
От:  
Дата: 07.07.07 13:38
Оценка:
Hello, LaPerouse!
You wrote on Sat, 07 Jul 2007 10:20:31 GMT:

L> Все верно. Имеются общеивестные критерии ООП: инкапсуляция,

L> полиморфизм, наследование. Из этих критериев, в частности,
L> следует, что "объекты с состоянием, обменивающиеся сообщениями". И
L> в этом смысле ООП он и в Африке ООП: языки, которые не
L> поддерживают его концепции не являются ОО-языками.

Уже не раз говорилось о том, что наследование — не обязательный признак ОО-языка.
Наследование, в частности — это способ обеспечить полиморфизм в статически типизированных языках. При наличии динамической типизации без наследования можно обойтись.
Posted via RSDN NNTP Server 2.1 beta
Re[21]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 07.07.07 14:59
Оценка: :)
Здравствуйте, deniok, Вы писали:

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


LP>>Скажите, возможно ли в Haskell определить типы, которые рекурсивно содержат друг друга?


LP>>К примеру, нечто такое


D>
D>data Tree a = Node {
D>    rootLabel :: a 
D>    subForest :: (Forest a) 
D>} 

D>type Forest a = [Tree a] -- список деревьев (type - это вроде C++ного typedef)
D>

D>Значение state будет храниться в a, которым этот тип параметризован.

1. По смыслу Node — это нечто вроде совокупности полей. Является ли Node ключевым словом?
2. rootLabel — это что, родитель для данной ячейки дерева? Предположим, у нас есть функция, которая принимает объект-ячейку дерева. Этот объект immutable, поэтому ф-ция модифицирует объект и возвращает его копию. У той копии rootLabel будет ссылаться на ячейку-родитель старого дерева, до тех пор, пока ячейка-родитель старого дерева не менялась, ведь так? Иди при любом изменении (в смысле создании при изменении) любой ячейки будет заново пересоздавться вся иерархия? В приницпе, это вопрос реализации, но все хотелось бы понять.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[21]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 07.07.07 15:04
Оценка: -1 :)))
Здравствуйте, YК, Вы писали:

YК>Hello, LaPerouse!

YК>You wrote on Sat, 07 Jul 2007 10:20:31 GMT:

L>> Все верно. Имеются общеивестные критерии ООП: инкапсуляция,

L>> полиморфизм, наследование. Из этих критериев, в частности,
L>> следует, что "объекты с состоянием, обменивающиеся сообщениями". И
L>> в этом смысле ООП он и в Африке ООП: языки, которые не
L>> поддерживают его концепции не являются ОО-языками.

YК>Уже не раз говорилось о том, что наследование — не обязательный признак ОО-языка.

YК>Наследование, в частности — это способ обеспечить полиморфизм в статически типизированных языках. При наличии динамической типизации без наследования можно обойтись.


Все же критерии ООП именно такие: полиморфизм, инкапсуляция, наследование. Это не я сказал. Если выкинуть отсюда что-либо, быть может это и будет ООП в ВАШЕМ понимании, но это не будет ООП в соответствии с его определением.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[22]: method(obj) то же самое, что и obj.method() ? Что за
От: LaPerouse  
Дата: 07.07.07 15:09
Оценка:
Здравствуйте, LaPerouse, Вы писали:

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


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


LP>>>Скажите, возможно ли в Haskell определить типы, которые рекурсивно содержат друг друга?


LP>>>К примеру, нечто такое


D>>
D>>data Tree a = Node {
D>>    rootLabel :: a 
D>>    subForest :: (Forest a) 
D>>} 

D>>type Forest a = [Tree a] -- список деревьев (type - это вроде C++ного typedef)
D>>

D>>Значение state будет храниться в a, которым этот тип параметризован.

LP>1. По смыслу Node — это нечто вроде совокупности полей. Является ли Node ключевым словом?

LP>2. rootLabel — это что, родитель для данной ячейки дерева? Предположим, у нас есть функция, которая принимает объект-ячейку дерева. Этот объект immutable, поэтому ф-ция модифицирует объект и возвращает его копию. У той копии rootLabel будет ссылаться на ячейку-родитель старого дерева, до тех пор, пока ячейка-родитель старого дерева не менялась, ведь так? Иди при любом изменении (в смысле создании при изменении) любой ячейки будет заново пересоздавться вся иерархия? В приницпе, это вопрос реализации, но все хотелось бы понять.

Черт, только что не заметил, что rootlabel имеет тип а. Почему то показалось, что Tree. Все же вопрос остается в силе. Возможно ли в хасклее ссылваться на родителя? Если можно, то интересцет ответ на пред. вопрос.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Социализм — это власть трудящихся и централизованная плановая экономика.
Re[22]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 07.07.07 16:38
Оценка:
Здравствуйте, LaPerouse, Вы писали:


LP>1. По смыслу Node — это нечто вроде совокупности полей. Является ли Node ключевым словом?


Нет, это обычный конструктор данных (единственный для типа Tree):
Node :: a -> Forest a -> Tree a


LP>2. rootLabel — это что, родитель для данной ячейки дерева?


rootLabel и subForest это функции-селекторы, эквивалент имён полей структуры:
rootLabel :: Tree a -> a
subForest :: Tree a -> Forest a

Они добавлены для удобства использования — тип можно было бы описать и без них (и без Forest)
data Tree a = Node a [Tree a]


Представь себе дерево директорий, у каждой директории есть список (Forest) субдиректорий и "имя" (rootLabel как раз возвращает "имя" директории. Ну то есть именем это будет в случае Tree String. А так там хранится значение произвольного типа a — параметрический полиморфизм в действии ).


LP>Предположим, у нас есть функция, которая принимает объект-ячейку дерева. Этот объект immutable, поэтому ф-ция модифицирует объект и возвращает его копию. У той копии rootLabel будет ссылаться на ячейку-родитель старого дерева, до тех пор, пока ячейка-родитель старого дерева не менялась, ведь так? Иди при любом изменении (в смысле создании при изменении) любой ячейки будет заново пересоздавться вся иерархия? В приницпе, это вопрос реализации, но все хотелось бы понять.


Да нет же. Всё вообще неизменяемое. Поэтому новые деревья могут легко использовать куски старых, если им для создания они требуется. Это легче пояснить на списках:
old = [1,2,3]

add_head x xs = x:xs -- добавляет элемент x в голову списка xs

new = add_head 5 old -- [5,1,2,3]

В памяти будет так (стрелочки задают указатели)
old -> 1 -> 2 -> 3 -> null
       ^
       |
new -> 5
Re[22]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 07.07.07 16:46
Оценка: +3
Здравствуйте, LaPerouse, Вы писали:


LP>Все же критерии ООП именно такие: полиморфизм, инкапсуляция, наследование. Это не я сказал. Если выкинуть отсюда что-либо, быть может это и будет ООП в ВАШЕМ понимании, но это не будет ООП в соответствии с его определением.


Здесь была масса холиваров по этому поводу, можно воспользоваться поиском. Не стоит начинать ещё один. Для современных мэйнстримовых статически типизированных языков это действительно общепринятые критерии. RSDN community в наиболее трезвомыслящей его части (сугубое ИМХО ) пришло к выводу, что лучшее (наиболее полное) однострочное определение сущности ООП — это объекты с состоянием, обменивающиеся сообщениями.
Re[23]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 07.07.07 16:56
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Черт, только что не заметил, что rootlabel имеет тип а. Почему то показалось, что Tree. Все же вопрос остается в силе. Возможно ли в хасклее ссылваться на родителя? Если можно, то интересцет ответ на пред. вопрос.


Что значит ссылаться? В Хаскелле описывается алгебраическая структура данных. При этом допустима (и широко используется) рекурсия. В этом смысле да, можно.

Но никаких ссылок на мутабельные объекты там в принципе нет. Да и объектов нет, есть выражения. Имя связывается с выражением раз и навсегда. Это же чистая функциональщина
Re[20]: method(obj) то же самое, что и obj.method() ? Что за
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 07.07.07 16:58
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Все верно. Имеются общеивестные критерии ООП: инкапсуляция, полиморфизм, наследование.


Это не общеизвестные критерии. Общеизвестные привёл deniok. Это то, как определил ООП создатель этого термина.

LP> Из этих критериев, в частности, следует, что "объекты с состоянием, обменивающиеся сообщениями". И в этом смысле ООП он и в Африке ООП: языки, которые не поддерживают его концепции не являются ОО-языками.


ОО-языки без наследования не ОО-языки?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[22]: method(obj) то же самое, что и obj.method() ? Что за
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 07.07.07 17:09
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>2. rootLabel — это что, родитель для данной ячейки дерева? Предположим, у нас есть функция, которая принимает объект-ячейку дерева. Этот объект immutable, поэтому ф-ция модифицирует объект и возвращает его копию. У той копии rootLabel будет ссылаться на ячейку-родитель старого дерева, до тех пор, пока ячейка-родитель старого дерева не менялась, ведь так? Иди при любом изменении (в смысле создании при изменении) любой ячейки будет заново пересоздавться вся иерархия? В приницпе, это вопрос реализации, но все хотелось бы понять.


В ФП нет объектов, есть значения. Однако на монадах можно построить аналог ссылок, которые будут ссылаться то на одно значение, то на другое (т.е. менять состояние). Это будет полностью аналогично языку с состоянием, только вместо int тип будет ref int, а вместо MyObject соответственно ref MyObject. Изменим значение в ссылке на другое — все наблюдатели это увидят.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[22]: method(obj) то же самое, что и obj.method() ? Что за
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 07.07.07 20:41
Оценка:
Здравствуйте, LaPerouse, Вы писали:

LP>Этот объект immutable, поэтому ф-ция модифицирует объект и возвращает его копию.


... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[22]: method(obj) то же самое, что и obj.method() ? Что за
От:  
Дата: 08.07.07 12:18
Оценка:
Здравствуйте, LaPerouse, Вы писали:

L>>> Все верно. Имеются общеивестные критерии ООП: инкапсуляция,

L>>> полиморфизм, наследование. Из этих критериев, в частности,
L>>> следует, что "объекты с состоянием, обменивающиеся сообщениями". И
L>>> в этом смысле ООП он и в Африке ООП: языки, которые не
L>>> поддерживают его концепции не являются ОО-языками.

YК>>Уже не раз говорилось о том, что наследование — не обязательный признак ОО-языка.

YК>>Наследование, в частности — это способ обеспечить полиморфизм в статически типизированных языках. При наличии динамической типизации без наследования можно обойтись.


LP>Все же критерии ООП именно такие: полиморфизм, инкапсуляция, наследование. Это не я сказал. Если выкинуть отсюда что-либо, быть может это и будет ООП в ВАШЕМ понимании, но это не будет ООП в соответствии с его определением.


Вам же конечно не составит труда привести определение ООП, а также автора этого определения?
Re[16]: method(obj) то же самое, что и obj.method() ? Что за
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.07.07 01:29
Оценка:
Здравствуйте, Sergey J. A., Вы писали:
SJA>Но на уровне рантайма модификации то могут быть ?
Прежде, чем переходить на уровень рантайма, неплохо определиться с семантикой языковых конструкций.
SJA> Вот пусть компилятор транслирует "указатель на объект" в программе на указатель на указатель на функцию в реальном коде.
SJA>А применнеие ф-ии к объекту транслирует в добавление ф-ии в этот список. При этом меняется только указатель на ф-ию.
Ничего не получится.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[23]: method(obj) то же самое, что и obj.method() ? Что за
От: Кодёнок  
Дата: 09.07.07 04:26
Оценка: +1
Здравствуйте, YК, Вы писали:

LP>>Все же критерии ООП именно такие: полиморфизм, инкапсуляция, наследование. Это не я сказал. Если выкинуть отсюда что-либо, быть может это и будет ООП в ВАШЕМ понимании, но это не будет ООП в соответствии с его определением.


YК>Вам же конечно не составит труда привести определение ООП, а также автора этого определения?


У ООП нет однозначного определения.

Минимум для объектной ориентации, это
— есть объекты
— объекты шлют друг другу сообщения, где аргументами и ответами являются ссылки на другие объекты

Этого как ни странно, достаточно. Здесь нет ни полиморфизма, ни наследования (это понятия ОО-системы типов, которой может не быть); инкапсуляция следует сама собой из того, что нет других способов доступа кроме сообщений. Тут нет классов (интерфейсов) — объектам не обязательно знать, на какие сообщения какого формата другой объект умеет реагировать! Неверное сообщение может просто давать runtime error. И некоторые ОО-системы успешно работают подобным образом.

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

Так что даже если вы реализуете этот минимум в некотором ФП, это не покажет наличие поддержки ОО в этом ФП.
Re[17]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 09.07.07 06:31
Оценка:
Здравствуйте, Sinclair, Вы писали:

SJA>> Вот пусть компилятор транслирует "указатель на объект" в программе на указатель на указатель на функцию в реальном коде.

SJA>>А применнеие ф-ии к объекту транслирует в добавление ф-ии в этот список. При этом меняется только указатель на ф-ию.
S>Ничего не получится.
Не вижу пока никаких проблем.

//////////// Runtime ///////////////
typedef std::string (*string_converter)(std::string);

class string_converter_node
{
public:
    string_converter_node(string_converter f)
    {
        converter = f;
        next = NULL;
    }
    string_converter converter;
    string_converter_node * next;
};

void modify_string(string_converter_node *root, string_converter f)
{
    while(root->next != NULL)
        root = root->next;
    
    root->next = new string_converter_node(f);
}

std::string get_str(string_converter_node *root)
{
    std::string cur;

    while(root != NULL)
    {
        cur = root->converter(cur);
        root = root->next;
    }

    return cur;
}


/////////////// Код приложения ///////////////////////////////
concat s1 s2 = s1 + s2

s1 = "foo"
s2 = s1
s1.concat("bar")
print s1
print s2

/////////////////////////// Транслируется в ////////////////////////

// constant "foo"
std::string foo(std::string)
{
    return "foo";
}

// constant "bar"
std::string bar(std::string)
{
    return "bar";
}

std::string concat(std::string s1, std::string s2)
{
    return s1 + s2;
}

void main()
{
    string_converter_node *s1 = new string_converter_node(foo);
    string_converter_node *s2 = s1;
    modify_string(s, lambda x: concat(x, bar));    // нужна поддержка карринга
    puts(get_str(s1).c_str());
    puts(get_str(s2).c_str());
}

GoJanus для FireFox
Re[18]: method(obj) то же самое, что и obj.method() ? Что за
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.07.07 06:52
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

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


SJA>>> Вот пусть компилятор транслирует "указатель на объект" в программе на указатель на указатель на функцию в реальном коде.

SJA>>>А применнеие ф-ии к объекту транслирует в добавление ф-ии в этот список. При этом меняется только указатель на ф-ию.
S>>Ничего не получится.
SJA>Не вижу пока никаких проблем.
Указатель в ФП модифицировать нельзя. Поэтому "указатель на указатель" ничего интересного тебе не даст. Всё, на этом приехали. Максимум, что можно получить — функцию "Iterate", которая получит по текущему состоянию "мира" новое состояние "мира", создав клоны всех-всех объектов так, чтобы все ссылки проапдейтились. С реалистической точки зрения — малоинтересно.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[19]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 09.07.07 07:22
Оценка:
Здравствуйте, Sinclair, Вы писали:

SJA>>>> Вот пусть компилятор транслирует "указатель на объект" в программе на указатель на указатель на функцию в реальном коде.

SJA>>>>А применнеие ф-ии к объекту транслирует в добавление ф-ии в этот список. При этом меняется только указатель на ф-ию.
S>>>Ничего не получится.
SJA>>Не вижу пока никаких проблем.
S>Указатель в ФП модифицировать нельзя. Поэтому "указатель на указатель" ничего интересного тебе не даст. Всё, на этом приехали.

На уровне языка никаких указателей на указатели нет:
/////////////// Код приложения ///////////////////////////////
concat s1 s2 = s1 + s2

s1 = "foo"
s2 = s1
s1.concat("bar")
print s1
print s2


Есть 2 ссылки на объекты — s1, s2. Через s1 объект модифицируется. Через s2 можно наблюдать эту модификацию. С точки зрения прикладного програмиста, вообще не видно как реализовано состояние объектов.

GoJanus для FireFox
Re[20]: method(obj) то же самое, что и obj.method() ? Что за
От: deniok Россия  
Дата: 09.07.07 08:35
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

SJA>
SJA>/////////////// Код приложения ///////////////////////////////
SJA>concat s1 s2 = s1 + s2

SJA>s1 = "foo"
SJA>s2 = s1
SJA>s1.concat("bar")
SJA>print s1
SJA>print s2
SJA>


SJA>Есть 2 ссылки на объекты — s1, s2. Через s1 объект модифицируется. Через s2 можно наблюдать эту модификацию. С точки зрения прикладного програмиста, вообще не видно как реализовано состояние объектов.


Ну и? Это получился некий императивный язык. Тут нельзя переставить местами 3 и 4 строки — декларативность нарушена.
Re[24]: method(obj) то же самое, что и obj.method() ? Что за
От:  
Дата: 09.07.07 08:46
Оценка:
Hello, !
You wrote on Mon, 09 Jul 2007 04:26:10 GMT:

LP>>> Все же критерии ООП именно такие: полиморфизм, инкапсуляция,

LP>>> наследование. Это не я сказал. Если выкинуть отсюда что-либо,
LP>>> быть может это и будет ООП в ВАШЕМ понимании, но это не будет
LP>>> ООП в соответствии с его определением.

YК>> Вам же конечно не составит труда привести определение ООП, а

YК>> также автора этого определения?

К> У ООП нет однозначного определения.


К> Минимум для объектной ориентации, это — есть объекты — объекты

К> шлют друг другу сообщения, где аргументами и ответами являются
К> ссылки на другие объекты

О чем и речь
Posted via RSDN NNTP Server 2.1 beta
Re[20]: method(obj) то же самое, что и obj.method() ? Что за
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.07.07 09:09
Оценка:
Здравствуйте, Sergey J. A., Вы писали:
SJA>На уровне языка никаких указателей на указатели нет:
SJA>
SJA>/////////////// Код приложения ///////////////////////////////
SJA>concat s1 s2 = s1 + s2

SJA>s1 = "foo"
SJA>s2 = s1
SJA>s1.concat("bar")
SJA>print s1
SJA>print s2
SJA>


SJA>Есть 2 ссылки на объекты — s1, s2. Через s1 объект модифицируется.

Еще раз: это невозможно в ФП. Вся фишка в том, что s1.concat не может ничего поменять. Всё, что можно сделать — это ввести новое определение для s1: s1 = s1.concat("bar").
SJA>Через s2 можно наблюдать эту модификацию.
Нет, нельзя. s2 является псевдонимом для "старого" s1, который был до дописывания "bar".

SJA>С точки зрения прикладного програмиста, вообще не видно как реализовано состояние объектов.

Это работает только в императивном языке.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[21]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 09.07.07 09:23
Оценка:
Здравствуйте, deniok, Вы писали:

SJA>>Есть 2 ссылки на объекты — s1, s2. Через s1 объект модифицируется. Через s2 можно наблюдать эту модификацию. С точки зрения прикладного програмиста, вообще не видно как реализовано состояние объектов.


D>Ну и? Это получился некий императивный язык. Тут нельзя переставить местами 3 и 4 строки — декларативность нарушена.


Вообще-то я и не собирался показать декларативный язык. Отвечал на

Строго говоря, так и есть. Объект только тогда является объектом, когда у него есть СОСТОЯНИЕ, а состояние не может быть не изменяемым. Такой "объект" может быть с легкостью заменен на функцию, возвращающей значение.


Я наверное не догнал, что это про объекты именно в дкларативных языках ?

GoJanus для FireFox
Re[21]: method(obj) то же самое, что и obj.method() ? Что за
От: Sergey J. A. Беларусь  
Дата: 09.07.07 09:25
Оценка: :)
Здравствуйте, Sinclair, Вы писали:

Собственно видимо я затупил изначально
Автор: Sergey J. A.
Дата: 09.07.07

GoJanus для FireFox
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.