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

M>Ну, в JavaScript'е (который там приведен) это одно и то же


M>Обычно в JS map реализуется так:

M>
M>function map(arr, fn)
M>{
M>    for(i = 0; i < arr.length; i++)
M>    {
M>        fn(arr[i]);
M>    }
M>}
M>


M> Чтобы голову не заморачивать


map должен возвращать другой массив/список, а не менять имеющися. А проблемы ява-скрипов пусть так и остаются их проблемами.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Так в чем же принципиальные отличия ФП от ИП?
От: Mamut Швеция http://dmitriid.com
Дата: 12.05.07 07:41
Оценка: :)
M>> Чтобы голову не заморачивать

VD>map должен возвращать другой массив/список, а не менять имеющися. А проблемы ява-скрипов пусть так и остаются их проблемами.


Будем считать особенностями реализации В С++ вон map — это вообще тип данных, и ничего


dmitriid.comGitHubLinkedIn
Re[11]: Так в чем же принципиальные отличия ФП от ИП?
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.05.07 14:34
Оценка:
Здравствуйте, Mamut, Вы писали:

M>Будем считать особенностями реализации В С++ вон map — это вообще тип данных, и ничего


Там мы сравниваем разные вещи имеющие одинаковые названия, или все же в нас еще осталась чистичка разума?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: Так в чем же принципиальные отличия ФП от ИП?
От: geniepro http://geniepro.livejournal.com/
Дата: 12.05.07 17:01
Оценка:
Здравствуйте, VladD2, Вы писали:

VD2> На замечание о ужасности и громоздкости кода начинашь о знаниях языка рассуждать.


ООП для Хаскелла инороден, а потому и ООП-код на нём выглядит громоздко...
С другой стороны, на С++ такой же код выглядел бы наверняка ещё более громоздко и ужастно...
Re[15]: Так в чем же принципиальные отличия ФП от ИП?
От: palm mute  
Дата: 12.05.07 20:05
Оценка:
Здравствуйте, geniepro, Вы писали:

G>ООП для Хаскелла инороден, а потому и ООП-код на нём выглядит громоздко...

+10
G>С другой стороны, на С++ такой же код выглядел бы наверняка ещё более громоздко и ужастно...
Да ну, кольцевой список и модификация состояния там как раз получаются абсолютно естественно, т.к. вместо IORef (Maybe MyObject) будет просто my_object*, вместо writeIORef будет '=', вместо readIORef будет просто обращение к переменной, тут С++ на своем поле и состязаться с ним трудно. У С++ другие проблемы.
Re[15]: Так в чем же принципиальные отличия ФП от ИП?
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.05.07 22:58
Оценка:
Здравствуйте, geniepro, Вы писали:

G>ООП для Хаскелла инороден, а потому и ООП-код на нём выглядит громоздко...


+1 Но что с того?

G>С другой стороны, на С++ такой же код выглядел бы наверняка ещё более громоздко и ужастно...


Возможно. Хотя вряд ли. Но один плохой пример не оправдывает другой.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Так в чем же принципиальные отличия ФП от ИП?
От: Tonal- Россия www.promsoft.ru
Дата: 13.05.07 17:55
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


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


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


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


G>А мы его немного не то чтобы изменим, а слегка дополним...

Ну, если уж по честному дополнять, то это будет примерно так:
G>
G>inline template<class F, class A,  template<class> Cont >
G>Cont<typename F::RetType> map(const Cont<A> &arr, F some_func) {
    Cont<typename F::RetType> res;
G>  for(i = 0; i < arr.length; i++)
G>    res.push_back(some_func(arr[i]));
G>  return res;
G>}

G>versus //?!

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

G>map(arr, some_func);
G>


Соответственно, накладываються ограничения на тип контейнера и на тип возврата функции.
Можно, вместо явной передачи контейнера перейти на итераторы — тогда придём к std::transform или std::for_each в зависимости от того нужен нам результат или нет.
Т.е.
ArrType arr[] = {1, 2, 3, 4};
std::for_each(arr, arr + lengthOf(arr), some_func)
... << RSDN@Home 1.2.0 alpha rev. 677>>
Re[8]: Так в чем же принципиальные отличия ФП от ИП?
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.05.07 01:06
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Соответственно, накладываються ограничения на тип контейнера и на тип возврата функции.

T>Можно, вместо явной передачи контейнера перейти на итераторы — тогда придём к std::transform или std::for_each в зависимости от того нужен нам результат или нет.

Вот transform и есть map, только как и многое в С++ громоздкий и неудобный.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Так в чем же принципиальные отличия ФП от ИП?
От: Tonal- Россия www.promsoft.ru
Дата: 14.05.07 04:26
Оценка:
Здравствуйте, VladD2, Вы писали:
T>>Можно, вместо явной передачи контейнера перейти на итераторы — тогда придём к std::transform или std::for_each в зависимости от того нужен нам результат или нет.

VD>Вот transform и есть map

Если нам результат map-а не нужен, то std::for_each вполне канает.
Хотя в чистом ФП мап без результата похоже не часто встречается.

VD>, только как и многое в С++ громоздкий и неудобный.

Стоит упомянуть С++ или Python и "Остапа понесло"
... << RSDN@Home 1.2.0 alpha rev. 677>>
Re[10]: Так в чем же принципиальные отличия ФП от ИП?
От: deniok Россия  
Дата: 14.05.07 04:41
Оценка:
Здравствуйте, Tonal-, Вы писали:

VD>>Вот transform и есть map

T>Если нам результат map-а не нужен, то std::for_each вполне канает.
T>Хотя в чистом ФП мап без результата похоже не часто встречается.

В чистом ФП функции без возвращаемого значения вообще не бывает
Re[12]: Так в чем же принципиальные отличия ФП от ИП?
От: Mamut Швеция http://dmitriid.com
Дата: 14.05.07 10:38
Оценка: :))
M>>Будем считать особенностями реализации В С++ вон map — это вообще тип данных, и ничего

VD>Там мы сравниваем разные вещи имеющие одинаковые названия, или все же в нас еще осталась чистичка разума?


Все, сдаюсь, сдаюсь


dmitriid.comGitHubLinkedIn
Re[12]: Так в чем же принципиальные отличия ФП от ИП?
От: Аноним  
Дата: 25.05.07 11:26
Оценка: +1 :)
G>1) Ромбик мне из объектов не изобразите? Чтобы два иорефа в структуре данных на один объект указывали. Зело хоцца на идентити в действии поглядеть.

в хаскеле, ввиду его божественной и несравненной чистоты, нет переменных (variables). но в нём есть ссылки (pointers). поэтому то, что в императивном языке делается с помощью переменных, в хаскеле эмулируется с использованием константных ссылок (не путать со ссылками на константы). итак,

main = do x <- newIORef 1
          a <- readIORef x
          writeIORef x (a+1)


эвивалетно следующему:

main()
{
    int* const x = new int(1);
    const int a = *x;
    *x = a+1;
}


можно также написать эквивалентный с++ код с использованием references, но они синтаксически-невидимо разыменовываются

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

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


с другой стороны, в хаскеле низкоуровневый имеративный код я писал только в двух случаях — для general-purpose библиотек, где нужна максимальная эффектвиность, и как часть кода, работающего с низкоуровневыми императивными библиотеками (написанные на C++). писать же императивные алгоритмы обработки данных на хаскеле — это в большинстве случаев нонсенс
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.