Re[8]: Так в чем же принципиальные отличия ФП от ИП?
От: palm mute  
Дата: 10.05.07 14:10
Оценка:
Здравствуйте, Gaperton, Вы писали:
G>Ты почти прав. Только ты упустил главное из ООП-шного инструментария. Что такое "объект"?
G>Объект = АДТ (абстрактный тип данных) + состояние
G>АДТ = тип данных, определяющийся набором операций над ним. С этим у ФЯ все в порядке.

G>Объект же не просто АДТ — он имеет состояние и "идентити" — т.е. в системе могут существовать два одинаковых по состоянию объекта с разным идентити. В ОО языках роль "идентити" играет указатель. Идентити — непременный атрибут изменяемого состояния и ООП.


Мне кажется, ты тоже упускаешь из виду, что а) многие ОО-паттерны (типа Стратегии) сичтаются архи-важными и архинужными и при этом не используют состояния б) в чистом Хаскеле можно при желании писать императивный код в IO- или ST- монаде, засунув состояние куда-нибудь в IORef.
Re[5]: Так в чем же принципиальные отличия ФП от ИП?
От: Константин Л. Франция  
Дата: 10.05.07 14:14
Оценка:
Здравствуйте, Mamut, Вы писали:

КЛ>>Однако что может быть хуже для читабельности, чем "функций высшего порядка"?


M>
M>arr = [1, 2, 3, 4];

M>for(i = 0; i < arr.length; i++)
M>{
M>    some_func(arr[i]);
M>}
M>


M>versus


M>
M>arr = [1, 2, 3, 4];

M>map(arr, some_func);
M>


M>Для человека, знающего, что такое map, второй код будет намного читабильнее. И таких примеров можно придумать много (как и котрпримеров, кстати )


угу.

А разве map возвращает фукнцию? Вы тут все приводите "лажевые" примеры. Я не про эти случаи говорил
Re[6]: Так в чем же принципиальные отличия ФП от ИП?
От: palm mute  
Дата: 10.05.07 14:19
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>А разве map возвращает фукнцию? Вы тут все приводите "лажевые" примеры. Я не про эти случаи говорил

Во-первых, таки да, map возвращает функцию (т.к. у map 2 аргумента, см. карринг). Во-вторых, функция высшего порядка может не только возвращать функции, но и принимать их как аргументы. Какой у map первый аргумент?
Re[6]: Так в чем же принципиальные отличия ФП от ИП?
От: deniok Россия  
Дата: 10.05.07 14:35
Оценка:
Здравствуйте, Константин Л., Вы писали:


КЛ>А разве map возвращает фукнцию? Вы тут все приводите "лажевые" примеры. Я не про эти случаи говорил


"Нелажевый" я привёл в посте выше
Автор: deniok
Дата: 09.05.07
. Наслаждайся
Re[7]: Так в чем же принципиальные отличия ФП от ИП?
От: Константин Л. Франция  
Дата: 10.05.07 14:38
Оценка:
Здравствуйте, deniok, Вы писали:

D>Здравствуйте, Константин Л., Вы писали:



КЛ>>А разве map возвращает фукнцию? Вы тут все приводите "лажевые" примеры. Я не про эти случаи говорил


D>"Нелажевый" я привёл в посте выше
Автор: deniok
Дата: 09.05.07
. Наслаждайся


не получилось
Re[7]: Так в чем же принципиальные отличия ФП от ИП?
От: Константин Л. Франция  
Дата: 10.05.07 14:41
Оценка: :)
Здравствуйте, palm mute, Вы писали:

PM>Здравствуйте, Константин Л., Вы писали:


КЛ>>А разве map возвращает фукнцию? Вы тут все приводите "лажевые" примеры. Я не про эти случаи говорил

PM>Во-первых, таки да, map возвращает функцию (т.к. у map 2 аргумента, см. карринг). Во-вторых, функция высшего порядка может не только возвращать функции, но и принимать их как аргументы. Какой у map первый аргумент?

1. какую функцию возвращает map?
2. как наличие 2х аргументов может коррелировать с тем, что map возвращает функцию
3. Я уже в курсе, что такое фвп и этот пример был для меня понятен
Re[8]: Так в чем же принципиальные отличия ФП от ИП?
От: palm mute  
Дата: 10.05.07 14:43
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>1. какую функцию возвращает map?

КЛ>2. как наличие 2х аргументов может коррелировать с тем, что map возвращает функцию
addOneToAllItems = map (+1)
Re[6]: Так в чем же принципиальные отличия ФП от ИП?
От: Mamut Швеция http://dmitriid.com
Дата: 10.05.07 14:46
Оценка:
КЛ>А разве map возвращает фукнцию?

Мне достаточно уже того, что оно принимает функцию в качестве параметра

КЛ>Вы тут все приводите "лажевые" примеры. Я не про эти случаи говорил


А про какие? Такие http://rsdn.ru/Forum/Message.aspx?mid=2458010&amp;only=1
Автор: Mamut
Дата: 23.04.07
?


dmitriid.comGitHubLinkedIn
Re[8]: Так в чем же принципиальные отличия ФП от ИП?
От: Quintanar Россия  
Дата: 10.05.07 14:49
Оценка:
Здравствуйте, Константин Л., Вы писали:

Л>1. какую функцию возвращает map?

КЛ>2. как наличие 2х аргументов может коррелировать с тем, что map возвращает функцию
КЛ>3. Я уже в курсе, что такое фвп и этот пример был для меня понятен

let memorize f =
  let hash = hash.create ....
  \arg ->
    try hash arg
    with hash_fail -> hash.add f arg; hash arg;

let process_data file = .....

let process_data_m = memorize process_data;


Is it clear?
Re[9]: Так в чем же принципиальные отличия ФП от ИП?
От: Константин Л. Франция  
Дата: 10.05.07 15:00
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Здравствуйте, Константин Л., Вы писали:


Л>>1. какую функцию возвращает map?

КЛ>>2. как наличие 2х аргументов может коррелировать с тем, что map возвращает функцию
КЛ>>3. Я уже в курсе, что такое фвп и этот пример был для меня понятен

Q>
Q>let memorize f =
Q>  let hash = hash.create ....
Q>  \arg ->
Q>    try hash arg
Q>    with hash_fail -> hash.add f arg; hash arg;

Q>let process_data file = .....

Q>let process_data_m = memorize process_data; 
Q>


Q>Is it clear?


no, it is not completely clear for me, but i've caught basic idea
Re[7]: Так в чем же принципиальные отличия ФП от ИП?
От: Константин Л. Франция  
Дата: 10.05.07 15:01
Оценка:
Здравствуйте, Mamut, Вы писали:

КЛ>>А разве map возвращает фукнцию?


M>Мне достаточно уже того, что оно принимает функцию в качестве параметра


КЛ>>Вы тут все приводите "лажевые" примеры. Я не про эти случаи говорил


M>А про какие? Такие http://rsdn.ru/Forum/Message.aspx?mid=2458010&amp;only=1
Автор: Mamut
Дата: 23.04.07
?


хотя-бы
Re[9]: Так в чем же принципиальные отличия ФП от ИП?
От: konsoletyper Россия https://github.com/konsoletyper
Дата: 10.05.07 15:44
Оценка:
Здравствуйте, palm mute, Вы писали:

PM> в чистом Хаскеле можно при желании писать императивный код в IO- или ST- монаде, засунув состояние куда-нибудь в IORef.


Хм... А зачем вообще писать императивный код на Хаскеле? Не прощели сделать интероп с теми языками, где императивность — родная парадигма?
... << RSDN@Home 1.2.0 alpha rev. 672>>
Re[10]: Так в чем же принципиальные отличия ФП от ИП?
От: palm mute  
Дата: 10.05.07 15:52
Оценка:
Здравствуйте, konsoletyper, Вы писали:

PM>> в чистом Хаскеле можно при желании писать императивный код в IO- или ST- монаде, засунув состояние куда-нибудь в IORef.

K>Хм... А зачем вообще писать императивный код на Хаскеле? Не прощели сделать интероп с теми языками, где императивность — родная парадигма?
Во-первых, я говорил о принципиальной возможности. Т.е., как и говорил, все для реализации ООП, включая identity и изменяемое состояние, в Хаскеле есть.
Во-вторых, весь ввод-вывод через интероп и сделан. Фокус в том, что у foreign-вызовов такой тип, что императивный по сути код формально остается чисто функциональным.
Re[11]: Надо посты перечитывать перед отправкой, блин
От: palm mute  
Дата: 10.05.07 16:09
Оценка:
Здравствуйте, palm mute, Вы писали:

PM>Т.е., как и говорил deniok, все для реализации ООП,...
Re[5]: Так в чем же принципиальные отличия ФП от ИП?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.05.07 16:53
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Для человека, знающего, что такое map, второй код будет намного читабильнее. И таких примеров можно придумать много (как и котрпримеров, кстати )


Жаль, правда, что код не идентичный.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Так в чем же принципиальные отличия ФП от ИП?
От: Gajdalager Украина  
Дата: 10.05.07 17:07
Оценка:
Здравствуйте, VladD2, Вы писали:

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


M>>Для человека, знающего, что такое map, второй код будет намного читабильнее. И таких примеров можно придумать много (как и котрпримеров, кстати )


VD>Жаль, правда, что код не идентичный.

Почему?
<< RSDN@Home 1.1.4 stable SR1 rev. 568>>
Сейчас играет Blind Guardian — And The Story Ends
Re[9]: Так в чем же принципиальные отличия ФП от ИП?
От: Gaperton http://gaperton.livejournal.com
Дата: 10.05.07 17:09
Оценка:
Здравствуйте, palm mute, Вы писали:

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

G>>Ты почти прав. Только ты упустил главное из ООП-шного инструментария. Что такое "объект"?
G>>Объект = АДТ (абстрактный тип данных) + состояние
G>>АДТ = тип данных, определяющийся набором операций над ним. С этим у ФЯ все в порядке.

G>>Объект же не просто АДТ — он имеет состояние и "идентити" — т.е. в системе могут существовать два одинаковых по состоянию объекта с разным идентити. В ОО языках роль "идентити" играет указатель. Идентити — непременный атрибут изменяемого состояния и ООП.


PM>Мне кажется, ты тоже упускаешь из виду, что а) многие ОО-паттерны (типа Стратегии) сичтаются архи-важными и архинужными и при этом не используют состояния


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

б) в чистом Хаскеле можно при желании писать императивный код в IO- или ST- монаде, засунув состояние куда-нибудь в IORef.

Попробуй решить проблему в моем примере. Кольцо из объектов, измени состояние. Посмотрим, что у тебя получится, и насколько это будет практично. К слову — пока ни у кого не получалось . Что не удивительно — получиться это не может.
Re[11]: Так в чем же принципиальные отличия ФП от ИП?
От: Gaperton http://gaperton.livejournal.com
Дата: 10.05.07 17:14
Оценка:
Здравствуйте, palm mute, Вы писали:

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


PM>>> в чистом Хаскеле можно при желании писать императивный код в IO- или ST- монаде, засунув состояние куда-нибудь в IORef.

K>>Хм... А зачем вообще писать императивный код на Хаскеле? Не прощели сделать интероп с теми языками, где императивность — родная парадигма?
PM>Во-первых, я говорил о принципиальной возможности. Т.е., как и говорил, все для реализации ООП, включая identity и изменяемое состояние, в Хаскеле есть.

Ты до сих пор не показал, как ты сделаешь из всего этого объект. А ты попробуй. Многие до тебя говорили, что мол ерунда, но ни у кого это сделать не получалось.

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

PM>Во-вторых, весь ввод-вывод через интероп и сделан. Фокус в том, что у foreign-вызовов такой тип, что императивный по сути код формально остается чисто функциональным.


Одно дело ввод-вывод, и совсем другое — объектная декомпозиция (не паттерны, а именно декомпозиция — подход к моделированию состояния сложной системы). Сие есть радикально разные вещи, имеющие мало общего.
Re[6]: Так в чем же принципиальные отличия ФП от ИП?
От: Gaperton http://gaperton.livejournal.com
Дата: 10.05.07 17:26
Оценка: :)
Здравствуйте, VladD2, Вы писали:

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


M>>Для человека, знающего, что такое map, второй код будет намного читабильнее. И таких примеров можно придумать много (как и котрпримеров, кстати )


VD>Жаль, правда, что код не идентичный.


А мы его немного не то чтобы изменим, а слегка дополним...
         inline template< class F, class A >
         A& map( A &arr, F some_func )
         {
for(i = 0; i < arr.length; i++)
{
  some_func(arr[i]);
}
          return arr;
         }

versus //?!

arr = [1, 2, 3, 4];

map(arr, some_func);


Теперь вроде как идентичен
Re[10]: Так в чем же принципиальные отличия ФП от ИП?
От: palm mute  
Дата: 10.05.07 17:54
Оценка: 18 (2)
Здравствуйте, Gaperton, Вы писали:

G>б) в чистом Хаскеле можно при желании писать императивный код в IO- или ST- монаде, засунув состояние куда-нибудь в IORef.

G>Попробуй решить проблему в моем примере. Кольцо из объектов, измени состояние. Посмотрим, что у тебя получится, и насколько это будет практично. К слову — пока ни у кого не получалось . Что не удивительно — получиться это не может.

module OO where

import Control.Monad
import Data.IORef

type Mutable = IORef 

data MyObject = MyObject { state :: Mutable Int, 
                           otherObject :: Mutable (Maybe MyObject) }
              deriving Eq

nullObject = newIORef Nothing

createMyObject :: Int -> IO MyObject
createMyObject init = do 
  x <- newIORef init
  other <- nullObject
  return (MyObject {state=x, otherObject=other})

setOther obj other = writeIORef (otherObject obj) (Just other)
readOther obj = readIORef (otherObject obj)
modifyState obj = modifyIORef (state obj)
readState obj = readIORef (state obj)

makeObjLoop = do 
  o1 <- createMyObject 1
  o2 <- createMyObject 2
  o3 <- createMyObject 3
  setOther o1 o2
  setOther o2 o3
  setOther o3 o1
  return o1

printLoop o = printLoop' o []
  where printLoop' obj visited = when (not (obj `elem` visited)) $ do          
                                  n       <- readState obj
                                  nextRef <- readOther obj
                                  putStrLn (show n)
                                  case nextRef of
                                    Just next -> printLoop' next (obj:visited)
                                    Nothing   -> putStrLn "You lied, this is not loop"


main = do
  loop <- makeObjLoop
  printLoop loop
  modifyState loop (+1)
  printLoop loop
  modifyState loop (+100)
  printLoop loop

Оно? Или ты что-то более сложное имел в виду? Прошу обратить внимание на 'deriving Eq' и 'obj `elem` visited' — это обещанная Identity. Полиморфизму сверху добавить тоже можно.
з.ы. Я не говорю, что так нужно делать, но можно — факт
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.