Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 26.08.04 17:51
Оценка:
Небольшая подборка высказываний из треда по статье Вадлера "Почему никто не использует функциональные языки"

А я не шублю. Я тебе сказал свое мнение. ФЯ ужербны и недоработаны. В них есть рациональное зерно, но оно отнюдь не в ругательствах вроде "lazy evaluation, lazy data structures" (это скорее затычки проблем чем достоинства). (VladD2)


В статье много интересных идей... Но! Это типичная рекламная статья от евангелиста данной технологии. Послушать аплогогетов нейронных сетей или ИИ — так совершенно непонятно, почему до сих пор по улицам не ходят андроиды, а мы все не в матрице... Тут применяются обычные рекламные трюки — декларируемые, потенциальные возможности выдаются за действительные... (AndreyFedotov по поводу статьи Вадлера)


На самом деле их никто не использует только потому, что в RSDN Mag до сих пор нет ни одной статьи на их тему. Я уверен, что как только выйдет хорошая статья с практическим примером того, как современная популярная прикладная задача на раз-два-три решается на функциональном языке, прикладники потянутся в эту сторону. Грамотный маркетинг — основа успеха. (Sinclair)


Нашел перевод классической статьи Джона Хьюза. Сомневаюсь, что у меня получилось-бы лучше. Нет, это не Вадлер. Это Хьюз. Вот это — типичная (и самая известная) рекламная статья. С практическими примерами — как заказывали.

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


Сильные стороны функционального программирования

21.09.04 19:43: Перенесено из 'Философия программирования'
23.10.04 21:08: Перенесено модератором из 'Священные войны' — AndrewVK
Re: Сильные стороны функционального программирования
От: bleed  
Дата: 26.08.04 19:57
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

Нашел перевод классической статьи Джона Хьюза. Сомневаюсь, что у меня получилось-бы лучше. Нет, это не Вадлер. Это Хьюз. Вот это — типичная (и самая известная) рекламная статья. С практическими примерами — как заказывали.


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

Вот и делают всякие научно-учебно-экспериментальные программы.
Re: Сильные стороны функционального программирования
От: AndreyFedotov Россия  
Дата: 27.08.04 05:50
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

Я обратил внимание на интересную особенность статей и примеров по ФЯ (в том числе и этого): они все иллюстрируют, как здорово можно реализовать тот или иной алгоритм, и рассуждают об общих принципах. Но как правильно отметил bleed — и я с ним полностью согласен — я ни разу не видел примера или хотя бы намёка — как на ФЯ построить систему и чем система (а не отдельный алгоритм) — будет лучше, почему её удобнее было бы строить на ФЯ или удобнее было бы развивать на ФЯ, чем на ИЯ.
Если вся система — как это часто бывает в телекоме — это набор достаточно сложных алгоритмов, легко реализуемых на ФЯ, притом с примитивной структурой самой системы, то польза от ФЯ очевидна. Но как быть, если алгоритмы просты, зато структура системы сложна (что бывает гораздо чаще — это бухгалтерские или ERP системы)?
Есть большое подозрение — что здесь если и есть выигрышь у ФЯ языков (в чём я лично очень сомневаюсь) — то он минимален и просто не стоит того, что бы их применять.
Хотя возможно, что я в этом ошибаюсь.
Re: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.04 11:18
Оценка: 1 (1) +6
Здравствуйте, Gaperton, Вы писали:

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

Я конечно понимаю, что писать статьи и вообще работать это не так приятно как в форумах мутить, но пользы от этого было бы куда больше.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 27.08.04 11:28
Оценка: +1
Здравствуйте, VladD2, Вы писали:

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


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


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


И правда, Gaperton, может образовать что-нибудь аля FLUG (Functional Laguanges User Group), где бы можно было бы делиться мнениями, помогать новичкам и т.п.
Я хоть и не корифей ФЯ, но с удовольствием бы посвятил им часть своего времени, ибо думаю, что зря это время не пройдёт, и будет в итоге положительный эффект.
Re[2]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 27.08.04 12:09
Оценка: 25 (2) -1
Здравствуйте, AndreyFedotov, Вы писали:

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


AF> Я обратил внимание на интересную особенность статей и примеров по ФЯ (в том числе и этого): они все иллюстрируют, как здорово можно реализовать тот или иной алгоритм, и рассуждают об общих принципах. Но как правильно отметил bleed — и я с ним полностью согласен — я ни разу не видел примера или хотя бы намёка — как на ФЯ построить систему и чем система (а не отдельный алгоритм) — будет лучше, почему её удобнее было бы строить на ФЯ или удобнее было бы развивать на ФЯ, чем на ИЯ.

Что-то у меня дежа вю: ты какую статью читал? Да она вся — сплошной разжеванный и в рот положеный пример чем система будет лучше, почему ее удобнее строить и развивать на ФЯ. Рассчитанный на человека, не знающего ФЯ, так как более сложные примеры он просто не поймет (и в этом не ничего странного — надо для начала языку научится, а потом рассуждать о построении приложений). Чтобы не было сомнений, автор в конце пояснил специально.

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

Case studies и руководства по дизайну есть в книгах на английском — вот то что видел я (Concurrent Programming in Erlang) и OCaml (Developng Applications with OCaml), и есть еще. Подход к проектированию в Erlang можно обсудить подробно — как раз недавно имел дискуссию на эту тему с Joe Armstrong-ом — рассказал ему Вовиновский взгляд на Erlang (типа это на самом деле смолток ) — и он меня по стенке размазал . Там вроде как все просто, на самом деле.

AF> Если вся система — как это часто бывает в телекоме — это набор достаточно сложных алгоритмов, легко реализуемых на ФЯ, притом с примитивной структурой самой системы, то польза от ФЯ очевидна.

Ну, я бы не сказал, что структура телекомовского софта примитивна. Откуда дровишки, почему ты считаешь, что это бывает в телекоме часто? Система состоящая из миллиона строк кода, которая делает полезную работу (AXD switch), не может иметь примитивную структуру. И уж во всяком случае, складская система из 50 тыщ строк , не может иметь структуру сложнее .

AF> Но как быть, если алгоритмы просты, зато структура системы сложна (что бывает гораздо чаще — это бухгалтерские или ERP системы)?Есть большое подозрение — что здесь если и есть выигрышь у ФЯ языков (в чём я лично очень сомневаюсь) — то он минимален и просто не стоит того, что бы их применять.

Скорее всего ты прав. Надо будет подумать о бухгалтерии на ФЯ , это будет экстрим.

AF> Хотя возможно, что я в этом ошибаюсь.

Подтвердить или опровергнуть это может только практика .
Re[2]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 27.08.04 12:22
Оценка:
Здравствуйте, VladD2, Вы писали:

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


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

Вообще-то я нашел статью, которую предлагал опубликовать в RSDN Mag Синклер. И ты ему поставил оценку "супер", типа ты с ним согласен. Я пошел вам навстречу, так сказать. Хотели статью? Вот вам статья. Публикуйте ее в своем журнале (с переводчиком и автором вопрос утрясти — и все дела).

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

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

Кстати, твои просьбы и предложения по форме — это нечто. От них очень легко отказаться.
Re[2]: Надо бы голосовалку
От: INTP_mihoshi Россия  
Дата: 27.08.04 12:46
Оценка:
Здравствуйте, VladD2, Вы писали:

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


Для этого надо сначала выяснить какому кол-ву народа это интересно. Голосовалкой например. Интересно, Не интересно, Не читал, но все равно возмущен, Не читал, но все равно восхищаюсь
Re[3]: Сильные стороны функционального программирования
От: AndreyFedotov Россия  
Дата: 27.08.04 12:47
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


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


AF>> Я обратил внимание на интересную особенность статей и примеров по ФЯ (в том числе и этого): они все иллюстрируют, как здорово можно реализовать тот или иной алгоритм, и рассуждают об общих принципах. Но как правильно отметил bleed — и я с ним полностью согласен — я ни разу не видел примера или хотя бы намёка — как на ФЯ построить систему и чем система (а не отдельный алгоритм) — будет лучше, почему её удобнее было бы строить на ФЯ или удобнее было бы развивать на ФЯ, чем на ИЯ.

G>Что-то у меня дежа вю: ты какую статью читал? Да она вся — сплошной разжеванный и в рот положеный пример чем система будет лучше, почему ее удобнее строить и развивать на ФЯ. Рассчитанный на человека, не знающего ФЯ, так как более сложные примеры он просто не поймет (и в этом не ничего странного — надо для начала языку научится, а потом рассуждать о построении приложений). Чтобы не было сомнений, автор в конце пояснил специально.

G>

...


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

G>Case studies и руководства по дизайну есть в книгах на английском — вот то что видел я (Concurrent Programming in Erlang) и OCaml (Developng Applications with OCaml), и есть еще. Подход к проектированию в Erlang можно обсудить подробно — как раз недавно имел дискуссию на эту тему с Joe Armstrong-ом — рассказал ему Вовиновский взгляд на Erlang (типа это на самом деле смолток ) — и он меня по стенке размазал . Там вроде как все просто, на самом деле.


AF>> Если вся система — как это часто бывает в телекоме — это набор достаточно сложных алгоритмов, легко реализуемых на ФЯ, притом с примитивной структурой самой системы, то польза от ФЯ очевидна.

G>Ну, я бы не сказал, что структура телекомовского софта примитивна. Откуда дровишки, почему ты считаешь, что это бывает в телекоме часто? Система состоящая из миллиона строк кода, которая делает полезную работу (AXD switch), не может иметь примитивную структуру. И уж во всяком случае, складская система из 50 тыщ строк , не может иметь структуру сложнее .
Это смотря какая телеком и какая складская система...

AF>> Но как быть, если алгоритмы просты, зато структура системы сложна (что бывает гораздо чаще — это бухгалтерские или ERP системы)?Есть большое подозрение — что здесь если и есть выигрышь у ФЯ языков (в чём я лично очень сомневаюсь) — то он минимален и просто не стоит того, что бы их применять.

G>Скорее всего ты прав. Надо будет подумать о бухгалтерии на ФЯ , это будет экстрим.

AF>> Хотя возможно, что я в этом ошибаюсь.

G>Подтвердить или опровергнуть это может только практика .
Вот это будет действительно интересно. Вроде я видел, что собирались делать резервирование авиабилетов на ФЯ. Интересно — что из этого выйдет...
Re[3]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 27.08.04 12:47
Оценка:
Здравствуйте, Курилка, Вы писали:

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


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


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


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


К>И правда, Gaperton, может образовать что-нибудь аля FLUG (Functional Laguanges User Group), где бы можно было бы делиться мнениями, помогать новичкам и т.п.

К>Я хоть и не корифей ФЯ, но с удовольствием бы посвятил им часть своего времени, ибо думаю, что зря это время не пройдёт, и будет в итоге положительный эффект.

Это было-бы интересно... К сожалению, у меня не очень много свободного времени, но это в любом случае было-бы интересно. Два вопроса:
1) Подобных групп нет в русском интернете? Я просто не в курсе. Если есть, то можно просто к ним присоединиться
2) Что для этого предлагаешь сделать технически? Т. е. какое участие требуется?
Re[4]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 27.08.04 12:54
Оценка:
Здравствуйте, AndreyFedotov, Вы писали:

AF> В том то и дело, что именно эту. Там говорятся правильные вещи, на тему модульности и т.д. Но дело в том, что это описано примерно на том же уровне, и очень похоже на то, что можно сказать про обычные ИЯ программы, проектируемые с помощью ООП. При описаннии ООА/ООП разводят подобный флейм. Однако когда от общих идей начинается переход к голимой практике — возникают проблемы. Идеологически простая программа может состоять из тысяч запутанных классов. Но это все знают — обычная реальность... Причём идеологически — всё так же очень гладко.

AF> Так вот — ни намёка на механизм, который обеспечивал бы лучшую ситуацию для ФЯ систем я не увидел. Похоже — что получится такая же запутанная система — просто запутанная по другому. Грабли окажутся расставленными в других местах...

Мнээ... Есть мнение, что "были-бы крылья, разбить можно", как говорил ихвестный персонаж мульфильмов "утиные истории". Нет механизмов, которые надежно обеспечивали бы меньшую запутанность для больших систем, кроме головы разработчика.
Re[5]: Сильные стороны функционального программирования
От: AndreyFedotov Россия  
Дата: 27.08.04 13:01
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


AF>> В том то и дело, что именно эту. Там говорятся правильные вещи, на тему модульности и т.д. Но дело в том, что это описано примерно на том же уровне, и очень похоже на то, что можно сказать про обычные ИЯ программы, проектируемые с помощью ООП. При описаннии ООА/ООП разводят подобный флейм. Однако когда от общих идей начинается переход к голимой практике — возникают проблемы. Идеологически простая программа может состоять из тысяч запутанных классов. Но это все знают — обычная реальность... Причём идеологически — всё так же очень гладко.

AF>> Так вот — ни намёка на механизм, который обеспечивал бы лучшую ситуацию для ФЯ систем я не увидел. Похоже — что получится такая же запутанная система — просто запутанная по другому. Грабли окажутся расставленными в других местах...

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


Вот и я об этом.
Но я честно говоря не увидел механизмов — которые делали бы эту систему проще — чем при ООА/ООП подходе. Те же ленивые вычисления прекрасно реализованы в большинстве сложных систем и без всякиз ФЯ. И, как мне кажется — вовсе не факт, что система стала бы проще, а не сложнее — будь она написана на ФЯ.
У меня складывается впечатление — что где ФЯ могут себя показать — так это во всаких алгоритмических трюках. Но как только сложность программы превышает некоторый предел — то тут их преимущество резко сходит на нет и всё определяется присловутой "головой разработчика"
Re[4]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 27.08.04 13:01
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


К>>И правда, Gaperton, может образовать что-нибудь аля FLUG (Functional Laguanges User Group), где бы можно было бы делиться мнениями, помогать новичкам и т.п.

К>>Я хоть и не корифей ФЯ, но с удовольствием бы посвятил им часть своего времени, ибо думаю, что зря это время не пройдёт, и будет в итоге положительный эффект.

G>Это было-бы интересно... К сожалению, у меня не очень много свободного времени, но это в любом случае было-бы интересно. Два вопроса:

G>1) Подобных групп нет в русском интернете? Я просто не в курсе. Если есть, то можно просто к ним присоединиться
Если честно — ФЯ только по аглицким источникам смотрел, поэтому про русскоязычные источники только от тебя узнал (что они вообще есть )

G>2) Что для этого предлагаешь сделать технически? Т. е. какое участие требуется?

Пока особо чётких идей нет, но как минимум было бы неплохо иметь форум посвящённый ФЯ, но даже не форум, а тему таку, где пару ветвей аля по языкам, по уровню (в любом случае помощь чайникам, к которым себя я тоже причисляю, будет ОЧЕНЬ нужна, популяризации без этого не видать).
Потом можно и offline-встречи пробовать организовать. Плюс можно попробовать что-нибудь РЕАЛЬНОЕ на том же ocaml'е сваять, чтобы не теоретические вещи, а проект жизненный был, главное, правда, придумать что бы это могло быть.
Не знаю, надо думать, да и не я один наверное может попридумывать в этом направлении.
Re[3]: Надо бы голосовалку
От: AndreyFedotov Россия  
Дата: 27.08.04 13:01
Оценка:
Здравствуйте, INTP_mihoshi, Вы писали:

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


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


INT>Для этого надо сначала выяснить какому кол-ву народа это интересно. Голосовалкой например. Интересно, Не интересно, Не читал, но все равно возмущен, Не читал, но все равно восхищаюсь


Вот это действительно интересная идея!
Re[6]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 27.08.04 13:14
Оценка:
Здравствуйте, AndreyFedotov, Вы писали:

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


AF> Вот и я об этом.

AF> Но я честно говоря не увидел механизмов — которые делали бы эту систему проще — чем при ООА/ООП подходе. Те же ленивые вычисления прекрасно реализованы в большинстве сложных систем и без всякиз ФЯ. И, как мне кажется — вовсе не факт, что система стала бы проще, а не сложнее — будь она написана на ФЯ.
AF> У меня складывается впечатление — что где ФЯ могут себя показать — так это во всаких алгоритмических трюках. Но как только сложность программы превышает некоторый предел — то тут их преимущество резко сходит на нет и всё определяется присловутой "головой разработчика"

Ну, положим, кое-какие практические исследования на эти темы есть. Но их проводил только Эрикссон, и только в телекоме . Они подтверждают выигрыш по продуктивности в четыре раза в сравнении с С++ и соответствующее уменьшение объема программы на системах объемом до 1.7 миллионов строк. Отчет Вигера я тебе посылал. Так что как минимум, не все так плохо. Но можно-ли переносить эту статистику на другие классы задач/языки — это вопрос. Собственно, нужно больше статистики.
Re[4]: Разница есть
От: INTP_mihoshi Россия  
Дата: 27.08.04 13:16
Оценка: 4 (1)
Здравствуйте, AndreyFedotov, Вы писали:

AF> В том то и дело, что именно эту. Там говорятся правильные вещи, на тему модульности и т.д. Но дело в том, что это описано примерно на том же уровне, и очень похоже на то, что можно сказать про обычные ИЯ программы, проектируемые с помощью ООП. При описаннии ООА/ООП разводят подобный флейм. Однако когда от общих идей начинается переход к голимой практике — возникают проблемы. Идеологически простая программа может состоять из тысяч запутанных классов. Но это все знают — обычная реальность... Причём идеологически — всё так же очень гладко.


Для хорошей модульности нужен достаточный уровень абстракции без потери строгости. На ИЯ этого достичь невозможно by design.

AF> Так вот — ни намёка на механизм, который обеспечивал бы лучшую ситуацию для ФЯ систем я не увидел. Похоже — что получится такая же запутанная система — просто запутанная по другому. Грабли окажутся расставленными в других местах...


Gaperton приводил цитату, содержащую этот намек, причем уже дважды.

ФЯ это не просто другой язык. Это в корне отличные принципы программирования. Требующие и от инструментов, и от программистов существенно больше. Конкретно, от инструментов — лучшую оптимизацию, от программистов — больше способность гибко мыслить. Имху пока ни те, ни другие еще в достаточной мере не развиты. Но я просто не вижу других путей. Уже очень давно все развитие ИЯ состоит только в том, что к ним приклеивается тот или иной кусочек, который уже давным-давно был в ФЯ.
Re[4]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.04 13:32
Оценка: +2
Здравствуйте, Gaperton, Вы писали:

G>Это было-бы интересно... К сожалению, у меня не очень много свободного времени,


Дык будем меньше флэймить.

G> но это в любом случае было-бы интересно. Два вопроса:

G>1) Подобных групп нет в русском интернете?

Я не видел. К тому же если даже и есть, то трибуна у них никакая. А РСДН это уже сила. Нас признают даже коммерческие конторы вроде МС и Интела.

G> Я просто не в курсе. Если есть, то можно просто к ним присоединиться


Это как угодно. Наше дело предложить, ваше дело...

G>2) Что для этого предлагаешь сделать технически? Т. е. какое участие требуется?


Технически нужно:
На начальном этапе:
1. Сформировать документ-призыв. Прислать его, например, мне, или на submit@rsdn.ru. Мы его вычитаем и создадим новую ветку в дереве статей и новый форум.
2. Создать инициативную группу.
3. Сформировать план развития радела.
Далее нужно писать статьи, отвечать на вопросы в форуме и всячески содействовать повышению рэйтинга этого форума.

В общем, как всегда много труда на ниве писательства и маркетинга.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.04 13:32
Оценка: +2
Здравствуйте, Gaperton, Вы писали:

G>Вообще-то я нашел статью, которую предлагал опубликовать в RSDN Mag Синклер. И ты ему поставил оценку "супер", типа ты с ним согласен. Я пошел вам навстречу, так сказать. Хотели статью? Вот вам статья. Публикуйте ее в своем журнале (с переводчиком и автором вопрос утрясти — и все дела).


ОК. Только у нас по этому поводу есть прцедура. Материал нужно сверстать в нашем шаблоне и заслать на submit@rsdn.ru. Далее его подхватят. Если верстать очень влом, то можно хотя бы заслать.

G>И что, блин, я слышу от тебя вместо "спасибо"?


Так пока не зачто. Вот когда что-то будет, то мой личный респет всем кто будет в этом участвовать.

G> Флейм я, значит, раздуваю.


Да фиг с ним с флэймом. Проблема в том, что толку от всех разговоров 0. Тут нужна упорная и крапотливая работа по популяризации. Как я тебе уже говорил, самая большая проблема ФЯ — это то что ими занимаются люди не от мира сего. Причем полностью лишенные способности продвигать свои идеи в массы.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Надо бы голосовалку
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.04 13:32
Оценка: 1 (1) +3
Здравствуйте, INTP_mihoshi, Вы писали:

INT>Для этого надо сначала выяснить какому кол-ву народа это интересно. Голосовалкой например. Интересно, Не интересно, Не читал, но все равно возмущен, Не читал, но все равно восхищаюсь


По-моему, все и так ясно. Тема ФЯ интересна многим. Но в том виде в котором она придствлена в рунете (да и в Интернете вообще) она не пригодна для мэйнстрима. Все скучно, тяжело и некрасиво. Идеи унжно продвигать. Мы готовы предоставить мощьнейшую платформу в рунете для этого. Дело только за теми кто не равнодушен к этому.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Кхм
От: INTP_mihoshi Россия  
Дата: 27.08.04 13:32
Оценка:
Здравствуйте, Курилка, Вы писали:

G>>2) Что для этого предлагаешь сделать технически? Т. е. какое участие требуется?

К>Пока особо чётких идей нет, но как минимум было бы неплохо иметь форум посвящённый ФЯ, но даже не форум, а тему таку, где пару ветвей аля по языкам, по уровню (в любом случае помощь чайникам, к которым себя я тоже причисляю, будет ОЧЕНЬ нужна, популяризации без этого не видать).
Кхм... На одну бы ветки ФПшников хватило А уровнень у всех имху примерно один.

К>Потом можно и offline-встречи пробовать организовать. Плюс можно попробовать что-нибудь РЕАЛЬНОЕ на том же ocaml'е сваять, чтобы не теоретические вещи, а проект жизненный был, главное, правда, придумать что бы это могло быть.

А реальное... Можно, например, попробовать написать более удобные примитивы для OCaml. А то существующие средства хотя и разнообразны, но имху довольно криво сочетают императивный и функциональный стиль. Гораздо хуже, чем это позволяет язык. В Haskell все было завязано на функциональность и списки, и это работало. Для Ocaml имху больше подошла бы идеология итераторов...
Re[7]: Сильные стороны функционального программирования
От: AndreyFedotov Россия  
Дата: 27.08.04 13:46
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Ну, положим, кое-какие практические исследования на эти темы есть. Но их проводил только Эрикссон, и только в телекоме . Они подтверждают выигрыш по продуктивности в четыре раза в сравнении с С++ и соответствующее уменьшение объема программы на системах объемом до 1.7 миллионов строк. Отчет Вигера я тебе посылал. Так что как минимум, не все так плохо. Но можно-ли переносить эту статистику на другие классы задач/языки — это вопрос. Собственно, нужно больше статистики.


Я в курсе. Но толку от этих исследований — не очень много, так как сначала создавался язык для более удобного и эффективного решения неких задач — а потом с удивлением обнаружили, что оказывается он эи задачи и правда эффективно решает.
По-моему гораздо важнее и интереснее — что получится для систем "обычных".
Я видел аналогичные исследования для матричных расчётов, но там было об этом сказано прямо — что делали специально под расчёты, потому и получилось — лучше. Кроме того, вспомним, что телеком — хорошо известная область — где на каждую задачу есть множество стандартных и опробированных решений, а сама система легко собирается из этих "кубиков" (я имею в виду естественно коммуникационную часть системы). Ещё замечу, что и в телекоме и в математике или физичских расчётах (где ФЯ так же эффективны) — фокус (основная часть системы) — это довльно сложные мат алгоритмы, причём эффективность их выполнения играет решающую роль. При этом сама система может быть тривиально простой, что то вроде — загрузили цифирки из текстового файла, запустили алгоритм, записали цифирки в другой файл. То есть все за рамками расчётной части — тривиально.
В традиционных же системах часто всё наоборот — алгоритмы просты, время их выполнения не особо критично (список из 10 строчек можно сортировать и пузырьком) — зато логика откуда, что и куда записать — может быть черезвычайно сложной. Вот потому и возникают соменения в эфектинвости ФЯ для таких систем. Тут ИЯ — явно лучше.
Re[3]: Сильные стороны функционального программирования
От: s.ts  
Дата: 27.08.04 13:50
Оценка:
Hello, Gaperton!
You wrote on Fri, 27 Aug 2004 12:09:39 GMT:

G> Ну, я бы не сказал, что структура телекомовского софта примитивна.

G> Откуда дровишки, почему ты считаешь, что это бывает в телекоме часто?
G> Система состоящая из миллиона строк кода, которая делает полезную
G> работу (AXD switch), не может иметь примитивную структуру. И уж во
G> всяком случае, складская система из 50 тыщ строк , не может иметь
G> структуру сложнее .

Может-может. Есть системы "большие", а есть "сложные" — это разные вещи. И сложность меряется вовсе не в строках кода.
Posted via RSDN NNTP Server 1.9 beta
Re[6]: Кхм
От: Курилка Россия http://kirya.narod.ru/
Дата: 27.08.04 13:54
Оценка: +1
Здравствуйте, INTP_mihoshi, Вы писали:

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


G>>>2) Что для этого предлагаешь сделать технически? Т. е. какое участие требуется?

К>>Пока особо чётких идей нет, но как минимум было бы неплохо иметь форум посвящённый ФЯ, но даже не форум, а тему таку, где пару ветвей аля по языкам, по уровню (в любом случае помощь чайникам, к которым себя я тоже причисляю, будет ОЧЕНЬ нужна, популяризации без этого не видать).
INT>Кхм... На одну бы ветки ФПшников хватило А уровнень у всех имху примерно один.

Может я просто уже в светлое будущее смотрю?

К>>Потом можно и offline-встречи пробовать организовать. Плюс можно попробовать что-нибудь РЕАЛЬНОЕ на том же ocaml'е сваять, чтобы не теоретические вещи, а проект жизненный был, главное, правда, придумать что бы это могло быть.

INT>А реальное... Можно, например, попробовать написать более удобные примитивы для OCaml. А то существующие средства хотя и разнообразны, но имху довольно криво сочетают императивный и функциональный стиль. Гораздо хуже, чем это позволяет язык. В Haskell все было завязано на функциональность и списки, и это работало. Для Ocaml имху больше подошла бы идеология итераторов...

Ну вот видишь, уже идея, можешь её более чётко это дело описать так, чтобы можно было бы людям за это дело браться и ваять что-нибудь толковое?
Но, вообще-то это всё равно за рамки ФЯ не выходит, реальное имелось в виду что-нибудь такое, чтобы можно было чуть не обычному юзеру показать, а он сказал: нифига себе!
Т.е. как влад тут вещал — слишком поклонники ФЯ завязаны сами на себя (рекурсия, однако ), а на остальной народ даже почти и не смотрят.
Так вот имхо РЕАЛЬНОЕ — это как раз что-то чтобы остального народа касалось.
Re[5]: Разница есть
От: AndreyFedotov Россия  
Дата: 27.08.04 13:54
Оценка:
Здравствуйте, INTP_mihoshi, Вы писали:

INT>Для хорошей модульности нужен достаточный уровень абстракции без потери строгости. На ИЯ этого достичь невозможно by design.


Да? Сколько я видел — прекрасно удаётся, правда это требует от разработчика творческого взгляда и большой работы.

AF>> Так вот — ни намёка на механизм, который обеспечивал бы лучшую ситуацию для ФЯ систем я не увидел. Похоже — что получится такая же запутанная система — просто запутанная по другому. Грабли окажутся расставленными в других местах...


INT>Gaperton приводил цитату, содержащую этот намек, причем уже дважды.


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

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

INT>Имху пока ни те, ни другие еще в достаточной мере не развиты. Но я просто не вижу других путей. Уже очень давно все развитие ИЯ состоит только в том, что к ним приклеивается тот или иной кусочек, который уже давным-давно был в ФЯ.

Точно тоже можно сказать и про ФЯ языки. Со второй половины 60-х их развитие — это или приделывание кучков ИЯ языков или — изобретение способов, как сделать то, что ИЯ языки давно и легко делают.
А вот сам факт того, что прикручиваются кусочки, а не осуществляется переход на ФЯ — лучший показатель того, что этих "кусочков" — в форме STL или любой другой — более чем хватает. Осознайте наконец, что далеко не каждый программист на C++ знаком и тем более использует даже STL.
Re[5]: Сильные стороны функционального программирования
От: AndreyFedotov Россия  
Дата: 27.08.04 13:56
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я не видел. К тому же если даже и есть, то трибуна у них никакая. А РСДН это уже сила. Нас признают даже коммерческие конторы вроде МС и Интела.


Предлагаю приделать в значки собщений что-нибудь вроде танца с саблями...
Re: Сильные стороны функционального программирования
От: AndreyFedotov Россия  
Дата: 27.08.04 13:59
Оценка:
Здравствуйте, Gaperton, Вы писали:

Кстати! Вопрос возможно не очень в тему: А как классифицировать языки Mathcad/Maple/Mathematica и т.п.? Там очень многое явно напоминает функциональные языки...
Re[4]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 27.08.04 14:28
Оценка:
Здравствуйте, s.ts, Вы писали:

ST>Hello, Gaperton!

ST>You wrote on Fri, 27 Aug 2004 12:09:39 GMT:

G>> Ну, я бы не сказал, что структура телекомовского софта примитивна.

G>> Откуда дровишки, почему ты считаешь, что это бывает в телекоме часто?
G>> Система состоящая из миллиона строк кода, которая делает полезную
G>> работу (AXD switch), не может иметь примитивную структуру. И уж во
G>> всяком случае, складская система из 50 тыщ строк , не может иметь
G>> структуру сложнее .

ST>Может-может. Есть системы "большие", а есть "сложные" — это разные вещи. И сложность меряется вовсе не в строках кода.

Складские системы — одна из самых простых систем, которые просто бьются на компоненты, к которым элементарно собрать требования, и которые понятно как реализовывать. В сравнении, естественно. Такие проекты должны выполняться с минимальным риском и без сетований о дикой сложности, особенно если речь идет о 50К строк.

Тем более, что индустриальная статистика показывает, что производительность KLOC/hr не скачет дикими прыжками от проекта к проекту, а напротив — довольно стабильна. На групповых проектах она не выходит за коридор 20-40 LOC/hr (данные Carnegie-Mellon SEI; генеренный код не считается). Так что кол-во строк кода — это вполне адекватная мера сложности.
Re[5]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 27.08.04 16:44
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Технически нужно:

VD>На начальном этапе:
VD> 1. Сформировать документ-призыв. Прислать его, например, мне, или на submit@rsdn.ru. Мы его вычитаем и создадим новую ветку в дереве статей и новый форум.
Можешь дать пример такого документа?

VD> 2. Создать инициативную группу.

Пусть желающие в нее войти ответят на твой пост, для начала, а там подумаем, что с пунктом 3.
Re[5]: Разница есть
От: Silver_s Ниоткуда  
Дата: 27.08.04 18:01
Оценка: 18 (1) +1 -1 :)
Здравствуйте, INTP_mihoshi, Вы писали:

INT>ФЯ это не просто другой язык. Это в корне отличные принципы программирования. Требующие и от инструментов, и от программистов существенно больше. Конкретно, от инструментов — лучшую оптимизацию, от программистов — больше способность гибко мыслить. Имху пока ни те, ни другие еще в достаточной мере не развиты. Но я просто не вижу других путей.


Дело, ИМХО, даже не в том что требуется "...от программистов — больше способность гибко мыслить".
Тут скорее другие задачи требуются. Но не текнологии определяют задачи, а наоборот.

Сложная программа на функциональном языке, по большому счету, является просто функцией — т.е. из входных данных получает выходные. Можно все внутренности этой функции выкинуть и вставить другие, или полностью все переоптимизировать если результат не изменится.
А задачи которые сейчас больше востребованы не являются функциями. Эти задачи скорее являются реалтайм моделями, моделирующими реальный мир. Это множество объектов с множеством состояний, и с множеством правил перехода из одного состояния в другое. Реагирующие в реальном времени на внешние события.

Вот эта страничка форума не является функцией. Это сложная реалтайм модель. С огромным количеством обьектов и состогяний, которые выкинуть нельзя.
Такие задачи просто больше востребованы, как ни крути.
Re[4]: F#
От: Silver_s Ниоткуда  
Дата: 27.08.04 18:17
Оценка:
Здравствуйте, VladD2, Вы писали:


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


Самое сложное в функциональном программировании это придумать задачу, которую можно было бы решить на ФЯ.

А вобще я надеялся что эти парни сделают что то не оторванное от жизни. Но что то не очень они спешат.
http://research.microsoft.com/projects/ilx/fsharp-release.aspx

Никто эту штуку не ковырял еще случайно? Может все-таки есть очевидцы, которые поделятся впечатлениями?
Re[6]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.04 18:33
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Можешь дать пример такого документа?


Ну, то должно быть нечто среднее между статьями к проектам (можно посмотреть в разделе "проекты") и, например, вот такой статьей
Автор(ы): Беркович Вадим, Чудин Андрей
Дата: 09.04.2003
Практически во всех проектах можно встретить те или иные паттерны проектирования. Но далеко не часто они обозначены разработчиками. Проект, в котором явно обозначены все использованные паттерны, удобнее для понимания и более управляем. Можно сказать, что описание проекта в терминах паттернов добавляет новые метаданные о проекте. Если мы считаем, что данный класс реализует паттерн "итератор", мы сразу получаем представление об его интерфейсе и роли. Если же изначально весь проект реализован с использованием паттернов, то управление проектом упрощается. Обобщение удачных решений конкретных задач в паттерны и использование их в последующих проектах существенно ускоряет процесс разработки. А код становится более понятным и элегантным, и им можно будет воспользоваться повторно.
про патерны.

VD>> 2. Создать инициативную группу.

G>Пусть желающие в нее войти ответят на твой пост, для начала, а там подумаем, что с пунктом 3.

Дык для этого лучше открыть новую тему. Сформулировать все по человечески. А то многие могли просто пропустить эту сообщение.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Кхм
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.04 18:33
Оценка: 1 (1) +1
Здравствуйте, INTP_mihoshi, Вы писали:

INT>А реальное...


Да рельно больше нужна статья в котой давались бы общие понятия и сведения для быстрого старта. Ну, там, где брать компиляторы, отладчики среды (какие и как настраивать). Еще лучше было бы сделать подборку софта и залудить его на сидюк к журналу плюс список прямых сылок, а то и зип на нашем сайте.

А улучшения уже потом.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.04 18:33
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Ну, положим, кое-какие практические исследования на эти темы есть. Но их проводил только Эрикссон, и только в телекоме . Они подтверждают выигрыш по продуктивности в четыре раза в сравнении с С++ и соответствующее уменьшение объема программы на системах объемом до 1.7 миллионов строк. Отчет Вигера я тебе посылал. Так что как минимум, не все так плохо. Но можно-ли переносить эту статистику на другие классы задач/языки — это вопрос. Собственно, нужно больше статистики.


Дык выигрыша в продуктивности (программистов) я и так добьюсь во многих областях (особенно в бизнес-софте) взяв вместо С++ тот же C#. С++ язык довольно сложный и низкоуровенвый. На нем эффективно пишутся именно низукоуровенвые вещи требующие тонкой оптимизации по скорости выполения. Так что это не показатель.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.08.04 18:33
Оценка:
Здравствуйте, AndreyFedotov, Вы писали:

AF> В традиционных же системах часто всё наоборот — алгоритмы просты, время их выполнения не особо критично (список из 10 строчек можно сортировать и пузырьком) — зато логика откуда, что и куда записать — может быть черезвычайно сложной. Вот потому и возникают соменения в эфектинвости ФЯ для таких систем. Тут ИЯ — явно лучше.


Это можно сформулировать одним предложением. То что ты называешь "обычными задачами" на самом деле является системами обработки информации. А то к чему склонны ФЯ — это вычислительные и рассчетные задачи. Возможно так оно и есть. При обоработке информации бОльшая часть кода занимается порождением объектов, их копированием и другой обработкой. Тут более важно абстрагирование данных, а не алгоритмво. Чем тут могут помочь ФЯ не ясно. А в вычислительных задачах на первый план выходят требования абстрагирования алгоритмов. В современных ИЯ такие возможности предоставляются полиморфизмом и шаблонами/дженериками, которые иногда оказываются менее эффективным средством абстрагироания чем функции высшего порядка. Видимо поэтому ученые и околоученые круги на ура принимают ФЯ, а мэйнстрим (в основном пишущий прикладнуху для бизнеса и производства) вообще не осознает их необходимости.

Кстати, что могут дать линивые вычисления в рельных приложения кроме "залатывания концептуальных дыр" ФЯ я так и не осознал.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Разница есть
От: Gaperton http://gaperton.livejournal.com
Дата: 27.08.04 18:33
Оценка: 11 (3) +1
Здравствуйте, Silver_s, Вы писали:

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

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

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


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

А никто их и не будет выкидывать. Рассмотри пару моделей — Data Flow Diagram и Entity-Relationship Diagram. Эта пара в сочетании описывает практически любую задачу — вот он, функциональный взгляд на мир.

Чтобы ответить на такой вопрос, начать можно с того, реальная программа в большинстве ФЯ не является "чистой функцией". Например, на высшем уровне Erlang система выглядит как множество (потенциально очень большое — до 200000) взаимодействующих процессов, каждый из которых имеет состояние и определенный протокол взаимодействия. Похоже на объекты смоллтока, как писал Вовин. Считается нормальным использовать процесс как единицу инкапсуляции. Внутри процесса используется простой функциональный язык, описывающий логику работы системы. Т. е. внутри процесса — большая часть логики реализовано чистыми функциями. Между процессами ходят данные, которые преобразуются чистыми функциями.

Продолжить можно тем, что используя чистые функции, легко моделируется объекты с состояниями. Например, почти для любой императивной структуры данных существует аналог на чистых функциях. Основное отличие функциональных структур данных — в свойстве транзакционности. Это лучше показать на примере:
NewTree = insert( Element, Tree ),
do_something( NewTree, Tree );

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

Вобщем, проблем с моделированием объектов с состоянием у нас не будет даже если мы используем чистые функции. Это даже выглядеть будет вполне пристойным образом, хоть и немного по другому:
A1 = change1( A ),
A2 = change2( A1 ),
A3 = change3( A2 ),
...
Re[7]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 27.08.04 18:38
Оценка:
Здравствуйте, VladD2, Вы писали:

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


G>>Можешь дать пример такого документа?


VD>Ну, то должно быть нечто среднее между статьями к проектам (можно посмотреть в разделе "проекты") и, например, вот такой статьей
Автор(ы): Беркович Вадим, Чудин Андрей
Дата: 09.04.2003
Практически во всех проектах можно встретить те или иные паттерны проектирования. Но далеко не часто они обозначены разработчиками. Проект, в котором явно обозначены все использованные паттерны, удобнее для понимания и более управляем. Можно сказать, что описание проекта в терминах паттернов добавляет новые метаданные о проекте. Если мы считаем, что данный класс реализует паттерн "итератор", мы сразу получаем представление об его интерфейсе и роли. Если же изначально весь проект реализован с использованием паттернов, то управление проектом упрощается. Обобщение удачных решений конкретных задач в паттерны и использование их в последующих проектах существенно ускоряет процесс разработки. А код становится более понятным и элегантным, и им можно будет воспользоваться повторно.
про патерны.

Э-э-э... То есть что-то вроде основополагающей стати в духе "ФП: что, зачем и почему" в стиле FAQ к comp.lang.functional?

VD>>> 2. Создать инициативную группу.

G>>Пусть желающие в нее войти ответят на твой пост, для начала, а там подумаем, что с пунктом 3.
VD>Дык для этого лучше открыть новую тему. Сформулировать все по человечески. А то многие могли просто пропустить эту сообщение.
Разумно.
Re[9]: Сильные стороны функционального программирования
От: AndreyFedotov Россия  
Дата: 27.08.04 19:28
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Это можно сформулировать одним предложением. То что ты называешь "обычными задачами" на самом деле является системами обработки информации. А то к чему склонны ФЯ — это вычислительные и рассчетные задачи. Возможно так оно и есть. При обоработке информации бОльшая часть кода занимается порождением объектов, их копированием и другой обработкой. Тут более важно абстрагирование данных, а не алгоритмво. Чем тут могут помочь ФЯ не ясно. А в вычислительных задачах на первый план выходят требования абстрагирования алгоритмов. В современных ИЯ такие возможности предоставляются полиморфизмом и шаблонами/дженериками, которые иногда оказываются менее эффективным средством абстрагироания чем функции высшего порядка. Видимо поэтому ученые и околоученые круги на ура принимают ФЯ, а мэйнстрим (в основном пишущий прикладнуху для бизнеса и производства) вообще не осознает их необходимости.


Именно это я и имел в виду , остаётся сюда добавить интенсивный ввод-вывод, обработку графики и драйвера и получаем, что Mainstream прекрасно обходится без ФЯ и ещё долго обходиться будет. Более того. Мне кажется, что в современном виде ФЯ вообще мейнстримом никогда не станут. Но их время может придти позже, когда для большнства типичных бизнес объектов будут выработаны определённые стандарты — тогда, возможно, ими можно будет манипулировать так же, как мы сейчас это делаем со строками или числами — используя достаточно чётко выраженные алгоритмы (сейчас фокус внимания всё ещё на технических деталях реализации подобных объектов). Вот в это время многие идеи ФЯ окажутся востребованы и применимы к месту.

VD>Кстати, что могут дать линивые вычисления в рельных приложения кроме "залатывания концептуальных дыр" ФЯ я так и не осознал.

Сейчас ФЯ интересно изучать приенительно к расчётным системам. Вроде бы (очень на то надеюсь) — ситуация в стране потихонечку изменяется к лучшему — и подобные задачи становятся более востребованными.
Re: Сильные стороны функционального программирования
От: Павел Леонов Россия icq: 138726397
Дата: 27.08.04 22:22
Оценка:
Здравствуйте, Gaperton, Вы писали :

Наиболее подходящая область из мейнстримовых будет бухня, налоги, зарплаты. Склады не берем, там просто.

Суть в том, что описывая на ИЯ в голове приходится держать/просчитывать задачу в двух импостасях и как алгоритм и как декларацию. Сложнее всего при чтении/правке кода, когда по командам нужно восстановить их общий смысл.
Posted via RSDN NNTP Server 1.9 beta
Re[8]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 28.08.04 07:34
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


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


G>>>Можешь дать пример такого документа?


VD>>Ну, то должно быть нечто среднее между статьями к проектам (можно посмотреть в разделе "проекты") и, например, вот такой статьей
Автор(ы): Беркович Вадим, Чудин Андрей
Дата: 09.04.2003
Практически во всех проектах можно встретить те или иные паттерны проектирования. Но далеко не часто они обозначены разработчиками. Проект, в котором явно обозначены все использованные паттерны, удобнее для понимания и более управляем. Можно сказать, что описание проекта в терминах паттернов добавляет новые метаданные о проекте. Если мы считаем, что данный класс реализует паттерн "итератор", мы сразу получаем представление об его интерфейсе и роли. Если же изначально весь проект реализован с использованием паттернов, то управление проектом упрощается. Обобщение удачных решений конкретных задач в паттерны и использование их в последующих проектах существенно ускоряет процесс разработки. А код становится более понятным и элегантным, и им можно будет воспользоваться повторно.
про патерны.

G>Э-э-э... То есть что-то вроде основополагающей стати в духе "ФП: что, зачем и почему" в стиле FAQ к comp.lang.functional?

VD>>>> 2. Создать инициативную группу.

G>>>Пусть желающие в нее войти ответят на твой пост, для начала, а там подумаем, что с пунктом 3.
VD>>Дык для этого лучше открыть новую тему. Сформулировать все по человечески. А то многие могли просто пропустить эту сообщение.
G>Разумно.

Gaperton — ждём от тебя чёткого поста по теме (аля призыва )
Re[3]: Сильные стороны функционального программирования
От: Glоbus Украина  
Дата: 28.08.04 08:57
Оценка: +1 -1
Здравствуйте, Gaperton, Вы писали:


Модульность...улучшение..производительность..ФЯ..ля-ля-ля... Какой-то пиар сплошной.
Товарищ, ответь пожалуйста на такой вот вопрос — если ФЯ так выгодны и мегаудобны — почему же они не используетются? Вот есть например МС — вершина ИТ-сектора, контора с возможно максимальной на сегодняшний день эффективностью — казалось бы, эти товарищи точно должны врубаться что удобно и эффективно, а что нет. Вопрос — почему не пользуют ФЯ, почему не пишут на том же хаскеле. Хотелось бы услышать ответ в формате "ФЯ не применяются по следующим причинам 1)..." а не "да нихрена вы не рубите в житухе..."
Удачи тебе, браток!
Re[7]: Разница есть
От: Silver_s Ниоткуда  
Дата: 28.08.04 09:11
Оценка:
Здравствуйте, Gaperton, Вы писали:

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

G>
G>NewTree = insert( Element, Tree ),
G>do_something( NewTree, Tree );
G>

G>Т. е. любое "изменение" обратимо, по причине того, что это никакое не изменение. В вышеприведенном примере будут существовать два дерева, которые будут физически разделять все узлы, кроме корня и пути от корня до вставленного элемента....

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

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

Вот к примеру, посмотрел я Samples для F#. Там один пример такой. Программа симулятор Life (думаю Life всем известна). Т.е. формочка, по менюшке, запускается и останавливается симулятор, и в формочке отображается процесс.
Правильная структура этой программы такая, есть один объект с состоянием — это матрица игрового поля, есть одна функция переводящая этот объект в следующее сотояние. Дерева переходов нету, оно плоское, т.е один сигнал из внешнего мира на переход состояния, получили сигнал перешли в следующее состояние и все. И плюс к этому формочка с менюшками, выводящая на экран состояние игрового поля.
Так вот, там формочка сделана на C#, а функция изменения состояния на F#. (хотя там немного по другому выглядит но суть такая) Эта функция пожалуй основная часть этой программы, для написаня этой функции действительно ФЯ может оказаться полезен. При написании этой функции на других языках, там бы вводили дополнительные вспомогательные костыли-объекты со своими состояниями и переходами, но они в данном случае не нужны.
А другие задачи по структурированию данных, задания логики переходов состояний итд, лучше наверное оставить другим языкам, которые в этом направлении продвинулись.



К ФЯ вроде привинчивают фичи для запоминания состояния, но от этого они скорее получают свойства обычных языков. Назначение ФЯ вроде немного другое.
Re[8]: Разница есть
От: Курилка Россия http://kirya.narod.ru/
Дата: 28.08.04 09:27
Оценка:
Здравствуйте, Silver_s, Вы писали:


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

Не знаю, но вот как раз с т.зр. структурирования данных имхо ФЯ довольно хорошо выглядят, т.к. всякие списки, деревья и проч. там просто изначально есть и обработка таких типов гораздо проще, причём типы эти полиморфны изначально.
Про логику переходов не знаю, не буду говорить, чего сам очень чётко не представляю
Re[4]: Сильные стороны функционального программирования
От: Xentrax Россия http://www.lanovets.ru
Дата: 28.08.04 19:59
Оценка: 26 (4) +1 -1
Здравствуйте, Glоbus, Вы писали:

G>Товарищ, ответь пожалуйста на такой вот вопрос — если ФЯ так выгодны и мегаудобны — почему же они не используетются?


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


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

В последние годы массовую популярность завоевывали только те языки, которые накачивали бооольшими деньгами. А у С++ такая хорошая жизнь наступила из-за того, что компилятор С++ без проблем компилировал код на C (с некоторыми малозночительными "особенностями").


MS обычным людям добра НЕ желает, а желает добра себе и побольше, поэтому придумала C# — Delphi/Java/VBasic/C++/С-подобный язык не для того, чтобы вбухать денег в перестройку фундамента индустрии, а чтобы как можно больше программистов узнали в этом языке знакомые конструкции и знакомые кнопочки. У них даже понятие такое есть — learning curve.

В разработке софта главное — заключить соглашение с OEM партнерами, и хорошо отрекламировать продукт, а не качественно и быстро его написать. Для тех, кто не может содержать программистов в Амеркие, есть Индия, Китай и даже Россия. Только совсем недавно, по мере роста зависимости от софта, и роста потребности в софте, и проникновении софта во все сферы жизни, включая унитаз, американские идеологи индустрии серьезно задумались, что же они будут делать когда программировать будет все население США, включая умалишенных и дошкольников.

Как бы вращение Земли вокруг Солнца тоже долго не признавалось (значительно дольше, чем прошло времени с тех пор, чем у ФЯ появились аппаратные и программные возможноси показать себя в реальном деле). Кроме того, в индустрии ПО постоянно наращивается уровень абстрагирования от железа и алгоритмов — благодарая насыщенным средам, полноценным библиотекам и компонентам, а также паттернам проектирования.

А вот кончится ли постепенное повышение уровня абстракции в разработке ПО переходом на более Ф. языки, неизвестно, так как меня ИЯ удовлетворяют полностью.
Re[7]: Сильные стороны функционального программирования
От: bleed  
Дата: 28.08.04 20:55
Оценка:
VD>>> 2. Создать инициативную группу.
G>>Пусть желающие в нее войти ответят на твой пост, для начала, а там подумаем, что с пунктом 3.

VD>Дык для этого лучше открыть новую тему. Сформулировать все по человечески. А то многие могли просто пропустить эту сообщение.


Я бы хотел поучаствовать и помочь чем смогу. Правда, опыт у меня не очень большой, но интерес есть приличный.
Re[8]: Разница есть
От: Gaperton http://gaperton.livejournal.com
Дата: 29.08.04 09:41
Оценка:
Здравствуйте, Silver_s, Вы писали:

S_>А если суть программы только поддержание состояния этого дерева и передача этого состояния во внешний мир (да хотя бы на экран монитора)? И если еще объекты в дереве привязаны к реальному миру...на одном напрмер висят открытые файлы, на другом ядерный реактор, на третьем сетевое подключение. Это немного меняет суть.


S_> Наверное программу с натяжкой можно считать конечным автоматом. На входы поступают сигналы из внешнего мира, состояние этого автомата считывается извне. Вот для моделирования КА как то плохо себе представляю ФЯ.


Erlang. Функция процесса, реализующая простой конечный автомат. Получает сообщения от других процессов — соответственно, это код с побочными эффектами.
state_machine( state_A ) ->
   receive
      switch_to_state_C -> state_machine( state_C );
      switch_to_state_B -> state_machine( state_B )
   end;

state_machine( state_B ) ->
   receive
      switch_to_state_A -> state_machine( state_A );
      switch_to_state_C -> state_machine( state_C )
   end;

state_machine( state_C ) ->
   receive
      exit -> nil;
      switch_to_state_A -> state_machine( state_A )
   end.


Erlang. То же самое, на чистых функциях. Используем так: NewState = switch_state( OldState, Message ).
switch_state( state_A, Message ) ->
   case Message of
      switch_to_state_C -> state_C;
      switch_to_state_B -> state_B
   end;

switch_state( state_B, Message ) ->
   case Message of
      switch_to_state_A -> state_A;
      switch_to_state_C -> state_C
   end;

switch_state( state_C, Message ) ->
   case Message of
      exit -> terminal_state;
      switch_to_state_A -> state_A
   end.


Сомневаюсь, что на С++ получится проще.
Re[8]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.08.04 11:55
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Э-э-э... То есть что-то вроде основополагающей стати в духе "ФП: что, зачем и почему" в стиле FAQ к comp.lang.functional?


От части. Не мловажную роль тут должен играть призыв объедениться всех заинтересованных людей. Но призывать конечно лучше предварительно объяснив перспективу. Причем нельзя перегибать палку и излишне идиалезировать ФЯ.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.08.04 11:55
Оценка:
Здравствуйте, bleed, Вы писали:

B>Я бы хотел поучаствовать и помочь чем смогу. Правда, опыт у меня не очень большой, но интерес есть приличный.


Прекрасно! Значит ждем новой темы и вообще открытия раздела.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Ну ладно... Реальная вычислительная задача.
От: Silver_s Ниоткуда  
Дата: 29.08.04 16:39
Оценка:
Ну хорошо, возьмем конкретную вычислительную задачу, если ФЯ в них сильны.
Нужно написать функцию. На вход ей подается:
1) координаты прямой на плоскости в виде двух точек (X,Y)
2) флажок указывающий на то что прямую рассматривать как бесконечную, или как отрезок по этим точкам.
3) Координаты прямоугольника.
Нужно подрезать эту прямую (или отрезок если флажок стоит) по границам прямоугольника(все что снаружи него обрезается), и вернуть координаты нового отрезка.

Несмотря на кажущуюся простоту, довольно муторная задача. На ИЯ напишется около 150 строк не очень читабельного кода. Уйдет на это несколько часов.

Даст ли что применение ФЯ для такой задачи? Легчие ли на нем это сделать? Получится ли код читабельным?
И если для такой задачи ФЯ плохо подходит, то для чего вобще тогда он подходит?
Re[2]: Ну ладно... Реальная вычислительная задача.
От: Quintanar Россия  
Дата: 29.08.04 20:54
Оценка: 33 (4)
Вот примерный код. Алгоритм работы простой. Сначала мы находим точки пересечения линии со сторонами прямоугольника, после чего полученный отрезок, если он есть, обрезаем по первоначальному отрезку.
Функции:
intersect_line ((x1,y1),(x2,y2)) ((a1,b1),(a2,b2)) flag
x,y — координаты точек прямой, a,b — координаты прямоугольника. Я предполагаю, что a1,b1 — нижний левый угол, а a2,b2 — верхний правый. flag = 1 если задан отрезок, иначе прямая.
В этой функции создаются функции для прямой по координатам x и y, затем находятся точки пересечения и потом, если
такие точки есть, вызывается функция обрезания по отрезку.

adjust_result p1 p2 (x1,y1) (x2,y2) flag
p — точки найденного отрезка, x,y — точки первоначального отрезка.
Если flag = 1 то находим пересечение этих двух отрезков. Для этого упорядочиваем их точки по возрастанию координаты x (если они равны, то по y). Создаем функцию для сравнения двух точек (приходится это делать из-за особого случая равенства координат x). А дальше рассматриваем 5 возможных случаев взаимного расположения отрезков.

Остальные функции простые и комментариев особых не требуют.
// специальный тип: либо какое-то значение либо ничего. Удобно применять подобный тип в случаях, когда
// функция может вернуть или значение или ошибку (или отказаться возвращать значение).
type 'a my_type = SOME of 'a | NONE;

// для создания функций для прямой
let create_line_func x (x1,y1) (x2,y2) =
    if (x1 = x2) then NONE else SOME (y1-y2)*(x-x1)/(x1-x2)+y1;

// Пересечение со стороной прямоугольника, y1 < y2
let check_intersect line_f (x, (y1, y2))
    match line_f x with
        SOME y => if ((y >= y1) and (y <= y2)) then (x,y) else nill
    |   NONE => nill;

let swap_points (x1,y1) (x2,y2) =
    if (x1 == x2)
        if (y1 > y2) then ((x2,y2),(x1,y1)) else ((x1,y1),(x2,y2))
    else if (x1 > x2) then ((x2,y2),(x1,y1) else ((x1,y1),(x2,y2));

// обрезаем отрезок p1 p2 по отрезку  x y 
adjust_result p1 p2 (x1,y1) (x2,y2) flag
    if (flag = 0) then SOME (p1,p2) else
    let (np1, np2) = swap_points p1 p2 in // упорядочиваем точки по возрастанию
    let (q1, q2) = swap_points (x1,y1) (x2,y2) in // ниже функция > для сравнения 2-х точек
    let greater = if (x1 = x2) then (function (x1,y1) (x2,y2) -> if (y1 > y2) then true else false)
                   else (function (x1,y1) (x2,y2) -> if (x1 > x2) then true else false) in
    // 5 случаев взимного расположения отрезков
    if (greater q1 np2) then NONE
    else if (greater np1 q1) then NONE
    else if ((greater q1 np1) and (greater np2 q2) then SOME (q1,q2)
    else SOME ((if (greater np1 q1) then np1 else q1), (if (greater (q2 np2) then np2 else q2));

// пересечение линии или отрезка с прямоугольником
let intersect_line ((x1,y1),(x2,y2)) ((a1,b1),(a2,b2)) flag =
    let line_f_h x = create_line_func x (x1,y1) (x2,y2) in //уравнение прямой относительно оси X
    let line_f_v y = create_line_func y (y1,x1) (y2,x2) in //уравнение прямой относительно оси Y
    let result = (check_intersect line_f_h (a1, (b1,b2))) :: (check_intersect line_f_h (a2, (b1,b2))) ::
                 (check_intersect line_f_v (b1, (a1,a2))) :: (check_intersect line_f_v (b2, (a1,a2))) :: 
                 nill in // здесь мы создали список точек пересечения прямой с прямоугольником
    match result with
        p1::p2::nill => SOME (adjust_result p1 p2 (x1,y1) (x2,y2) flag) // отрезок
    |   p1::nill => SOME (adjust_result p1 p1 (x1,y1) (x2,y2) flag)   // точка
    |   _ => NONE;                 // пустое множество
Re[9]: Сильные стороны функционального программирования
От: faulx  
Дата: 30.08.04 06:11
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Кстати, что могут дать линивые вычисления в рельных приложения кроме "залатывания концептуальных дыр" ФЯ я так и не осознал.


В статье был простейший пример. Если сформулировать в общих чертах: ленивые вычисления являются средством повышения модульности. В схеме вроде "producer — consumer" модуль-producer становится более изолированным от модуля-consumer'а, соотвественно, повышается возможность его повторного использования.
Re[10]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 30.08.04 06:39
Оценка:
Здравствуйте, faulx, Вы писали:

VD>>Кстати, что могут дать линивые вычисления в рельных приложения кроме "залатывания концептуальных дыр" ФЯ я так и не осознал.


F>В статье был простейший пример. Если сформулировать в общих чертах: ленивые вычисления являются средством повышения модульности. В схеме вроде "producer — consumer" модуль-producer становится более изолированным от модуля-consumer'а, соотвественно, повышается возможность его повторного использования.


Кхм... А при чем тут ленивые вычисления? ЛВ просто соттветствуют принципу "я не знаю, чему это равно, но знаю, как посчитать, еси меня спросят"
Re[11]: Сильные стороны функционального программирования
От: faulx  
Дата: 30.08.04 08:30
Оценка: 3 (1)
Здравствуйте, INTP_mihoshi, Вы писали:

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


VD>>>Кстати, что могут дать линивые вычисления в рельных приложения кроме "залатывания концептуальных дыр" ФЯ я так и не осознал.


F>>В статье был простейший пример. Если сформулировать в общих чертах: ленивые вычисления являются средством повышения модульности. В схеме вроде "producer — consumer" модуль-producer становится более изолированным от модуля-consumer'а, соотвественно, повышается возможность его повторного использования.


INT>Кхм... А при чем тут ленивые вычисления? ЛВ просто соттветствуют принципу "я не знаю, чему это равно, но знаю, как посчитать, еси меня спросят"


Я же говорю, в статье есть пример, очень простой, правда. Producer-у не нужно знать, когда прекращать producing данных. Соотвественну, consumer-у не нужно ничего знать о producer-е. В качестве средства коммуникации между ними служит (потенциально) бесконечный список (иногда его называют stream). Откуда он взялся, consumer-у все равно, он возьмет из него только то, что нужно. Producer-у это списка тоже неинтересно, сколько данных генерировать и когда останавливаться.

Если я не ошибаюсь, в Unix подобным образом работает кострукция program1 | program2.
Re[12]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 30.08.04 08:42
Оценка:
Здравствуйте, faulx, Вы писали:

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


F>Я же говорю, в статье есть пример, очень простой, правда. Producer-у не нужно знать, когда прекращать producing данных. Соотвественну, consumer-у не нужно ничего знать о producer-е. В качестве средства коммуникации между ними служит (потенциально) бесконечный список (иногда его называют stream). Откуда он взялся, consumer-у все равно, он возьмет из него только то, что нужно. Producer-у это списка тоже неинтересно, сколько данных генерировать и когда останавливаться.


F>Если я не ошибаюсь, в Unix подобным образом работает кострукция program1 | program2.


Глянь сюда
Автор: Курилка
Дата: 30.08.04
Re[3]: Ну ладно... Реальная вычислительная задача.
От: INTP_mihoshi Россия  
Дата: 30.08.04 13:38
Оценка: 21 (1)
Вот код того же самого для OCaml.

Представляем отрезок параметрическим уравнением a + k*b
По каждому измерению смотрим, какой отрезок значений k лежит в прямоугольнике.
Потом все эти отрезки пересекаем.
Работает для любого числа измерений.

let order (a,b) = 
if (a +. b == nan) 
    then (neg_infinity, infinity) (* Это случай, когда прямая проходит точно по краю прямоугольника *)
    else (if (a<b) then (a,b) else (b,a))

let cut_1d vec1d cut = (cut -. fst vec1d) /. snd vec1d

let dual_cut_1d vec1d (cut1, cut2) = order ((cut_1d vec1d cut1), (cut_1d vec1d cut2))

let add_cuts (min1, max1) (min2, max2) = (max min1 min2, min max1 max2)

let cut_vec_rect vec rect part = List.fold_left add_cuts part (List.map2 dual_cut_1d vec rect) 

let actual_cut_points vec rect part = 
    let (cut1, cut2) = cut_vec_rect vec rect part in
    if (cut1 <= cut2) 
        then List.map (fun (p, d) -> ((p +. cut1 *. d), (p +. cut2 *. d))) vec
        else []


Пустой список в ответе соответствует случаю "нет пересечений".

Это собственно код алгоритма. Далее несколько функций для приведения векторов и прямоугольников в нужный вид и пример использования.

let linia = (neg_infinity, infinity)
let otrezok = (0., 1.)

let bypoints2bydimensions vec = List.fold_left2 (fun l c1 c2 -> (c1,c2)::l) [] (fst vec) (snd vec)
let bydimensions2bypoints vec = List.fold_left (fun (l1, l2) (c1, c2) -> (c1::l1, c2::l2)) ([], []) vec

let makevec vec = List.map (fun (c1, c2) -> (c1, c2 -. c1)) (bypoints2bydimensions vec)
let makerect = bypoints2bydimensions
let showvec = bydimensions2bypoints

let testvec = makevec ([0.; 0.] , [2.; 0.])  (* ([x1; y1] , [x2; y2]) *) 
let testrect = makerect ([0.; 0.] , [3.; 2.]) (* ([x1; y1] , [x2; y2]) *)

let r = showvec (actual_cut_points testvec testrect linia)
Re[5]: Сильные стороны функционального программирования
От: Glоbus Украина  
Дата: 30.08.04 13:47
Оценка: +2 -2
Здравствуйте, Xentrax, Вы писали:

Какая-то патетика про мировой заговор мс. Если уж мы перешли к этому вопрос, то давай, уважаемый, не будем забывать, что мс это наверное контора которая на сегодняшний день из всех что есть больше всех "желает добра людям" как ты выразился. Тема перетиралась тыщу раз поэтому не будем на ней останавливаться — аргумент тут один — где МС и где все остальные
Так вот возвращаясь к вопросу — если мс такие киты капитализма — то чеж ОНИ такие ЛОХИ не юзают ФЯ? Повторяю — не обычные юзеры, которым как ты говоришь промыли мозги шарпами а именно сами МС?
Удачи тебе, браток!
Re[6]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 30.08.04 13:52
Оценка: +1 -1
Здравствуйте, Glоbus, Вы писали:

G>Так вот возвращаясь к вопросу — если мс такие киты капитализма — то чеж ОНИ такие ЛОХИ не юзают ФЯ? Повторяю — не обычные юзеры, которым как ты говоришь промыли мозги шарпами а именно сами МС?


А зачем? У них и так все хорошо Ну, не выходит WinFS — и хрен с ним. Выпустим без него, все равно купят. Ну, нету генериков на шарпе. Но все равно ж писать на нем будут.
Re[7]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 30.08.04 14:00
Оценка:
G>>Так вот возвращаясь к вопросу — если мс такие киты капитализма — то чеж ОНИ такие ЛОХИ не юзают ФЯ? Повторяю — не обычные юзеры, которым как ты говоришь промыли мозги шарпами а именно сами МС?

ах да, забыл главную причину. Фя придумали не они Вот доделают F#...
Re[6]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 30.08.04 15:01
Оценка: -2
Здравствуйте, Glоbus, Вы писали:

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

G>Так вот возвращаясь к вопросу — если мс такие киты капитализма — то чеж ОНИ такие ЛОХИ не юзают ФЯ? Повторяю — не обычные юзеры, которым как ты говоришь промыли мозги шарпами а именно сами МС?

Ага. "Если бы это была вещь стоящая, она за границей давно уже распространена была бы. Значит ты, дружок, ерунду придумал". Я понял принцип. Что удобно, думать не надо. Совсем. Вот, например, что я придумал, и хочу своей гениальной мыслью поделиться:

А почему МС не использует CVS? А почему МС не юзает Java? А почему у МС серваки не под Линухом, раз ваш линух такой крутой?? А??? Ацтой ваш линух патамучта. А что это МС не испозьзует ИБМ-овские мэйнфреймы? Сейчас, соберусь с мыслями, и пойду в форумы Java и Unix.

И что прикольно, стоит МС (гипотетически) перевести разработку на ФЯ, и вообще, изменить курс как Биллу за обедом по приколу в голову взбредет, так придется говорить то же самое, но с противоположным знаком. Придется, эта, быть в курсе!

Удивительно, а вы правда считаете, что успех продуктов микрософта как-нибудь связан с языками программирования, на которых они созданы?
Re[6]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 30.08.04 15:19
Оценка:
Здравствуйте, Glоbus, Вы писали:

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


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

G>Так вот возвращаясь к вопросу — если мс такие киты капитализма — то чеж ОНИ такие ЛОХИ не юзают ФЯ? Повторяю — не обычные юзеры, которым как ты говоришь промыли мозги шарпами а именно сами МС?
Так что возвращаясь к этому вопросу, вспомним, что в мире существует очень много вещей, которые не использует МС. Просто ну огромное количество. И факт, что МС не испольует нечто, будь МС хоть слоны капитализма — все равно не делает эти самые вещи ни лучше, ни хуже.

А слоны идут, известно куда. На север. Кстати, если кит на слона налезет — кто победит? ?
Re[4]: Ну ладно... Реальная вычислительная задача.
От: Gaperton http://gaperton.livejournal.com
Дата: 30.08.04 17:10
Оценка:
Здравствуйте, INTP_mihoshi, Вы писали:

Великолепно!
Re[10]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.08.04 17:54
Оценка:
Здравствуйте, faulx, Вы писали:

F>В статье был простейший пример. Если сформулировать в общих чертах: ленивые вычисления являются средством повышения модульности. В схеме вроде "producer — consumer" модуль-producer становится более изолированным от модуля-consumer'а, соотвественно, повышается возможность его повторного использования.


Что-то в упор не вижу повышения модульности от этих линивых вычислений.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.08.04 17:54
Оценка:
Здравствуйте, faulx, Вы писали:

F>Я же говорю, в статье есть пример, очень простой, правда. Producer-у не нужно знать, когда прекращать producing данных. Соотвественну, consumer-у не нужно ничего знать о producer-е. В качестве средства коммуникации между ними служит (потенциально) бесконечный список (иногда его называют stream). Откуда он взялся, consumer-у все равно, он возьмет из него только то, что нужно. Producer-у это списка тоже неинтересно, сколько данных генерировать и когда останавливаться.


Ну, и чем это ушучшает модульность по сравнению с тем же энумератором, стримом, системой передачи сообщений и т.п.?

F>Если я не ошибаюсь, в Unix подобным образом работает кострукция program1 | program2.


А в виндовс program1 > program2 и что?

В общем, я только укрепился во мнении, что ленивые вычисления — это средство склаживания проблем самого функционального подхода. В ИЯ я необходимости такого механизма не вижу.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 31.08.04 05:10
Оценка:
Здравствуйте, VladD2, Вы писали:

F>>Если я не ошибаюсь, в Unix подобным образом работает кострукция program1 | program2.


VD>А в виндовс program1 > program2 и что?


И где у тебя тут хотя бы намёк на типизацию?
Re[13]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 31.08.04 06:35
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Ну, и чем это ушучшает модульность по сравнению с тем же энумератором, стримом, системой передачи сообщений и т.п.?


Тем, что для абстракции нужны паттерны. У ФЯ паттерны "родные". А ИЯ паттерны пережевывает с большим напрягом. Поэтому простейшее решение задачи в ФЯ будет, как правило, менее завязанным на частности, чем простейшее решение той же задачи на ИЯ.
Re: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 31.08.04 07:41
Оценка: +1
Здравствуйте, Gaperton, Вы писали:

G>Сильные стороны функционального программирования

Красивая, простая и понятная статья. После ее прочтения у меня остался только один вопрос: А как это применить в жизни?
Дело в том, что автор неявно сужает все программирование к отображению некоторого входа на некоторый выход (http://msdn.microsoft.com/library/en-us/iissdk/iis/ref_prog_iaorefiwi.asp
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 31.08.04 07:48
Оценка:
Здравствуйте, Sinclair, Вы писали:

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


G>>Сильные стороны функционального программирования

S>Красивая, простая и понятная статья. После ее прочтения у меня остался только один вопрос: А как это применить в жизни?
S>Дело в том, что автор неявно сужает все программирование к отображению некоторого входа на некоторый выход (http://msdn.microsoft.com/library/en-us/iissdk/iis/ref_prog_iaorefiwi.asp

А причём тут IIsWebInfo (ADSI) ???
Re[2]: Сильные стороны функционального программирования
От: Silver_s Ниоткуда  
Дата: 31.08.04 08:17
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>... А как это применить в жизни?

S>Дело в том, что автор неявно сужает все программирование к отображению некоторого входа на некоторый выход (http://msdn.microsoft.com/library/en-us/iissdk/iis/ref_prog_iaorefiwi.asp

Компонентные технологии,создание объектных моделей повышает уровень абстракции в одном аспекте. Но алгоритмическая часть остается довольно низкоуровневой. ФЯ повышает уровень абстракции для алгоритмического аспекта. Программирование это не только построение удобных объектных моделей, но и алгоритмы тоже. Да конфигурирование IIS через ActiveDirectory непростая задача, но алгоритмически она для детей дошкольного возраста.

Вот чтобы легче это все применялось в реальной жизни. Нужно что то наподобии F#. Т.е. пусть бы был для начала какой нибудь даже примитивный функциональный язык, но чтобы очень хорошо интегрировался с программами на других языках. Чтобы алгоритмические куски можно было переносить на него. И хороший оптимизатор. F# вроде двигается в правильном направлении, из любого .NET языка можно обратиться к функциям на F#. И сам F# может дергать функции других языков через делегаты. Только все его никак не доделают этот F#.
Re[3]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 31.08.04 08:31
Оценка:
Здравствуйте, Курилка, Вы писали:

Ой, прошу прощения. Это у меня Janus взглюкнул. Блин, вся мессага потерялась!
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Ну ладно... Реальная вычислительная задача.
От: Larm Украина  
Дата: 31.08.04 08:36
Оценка: +2
Здравствуйте, Silver_s, Вы писали:

S_> Ну хорошо, возьмем конкретную вычислительную задачу, если ФЯ в них сильны.

S_>Нужно написать функцию. На вход ей подается:
S_>1) координаты прямой на плоскости в виде двух точек (X,Y)
S_>2) флажок указывающий на то что прямую рассматривать как бесконечную, или как отрезок по этим точкам.
S_>3) Координаты прямоугольника.
S_> Нужно подрезать эту прямую (или отрезок если флажок стоит) по границам прямоугольника(все что снаружи него обрезается), и вернуть координаты нового отрезка.

S_>Несмотря на кажущуюся простоту, довольно муторная задача. На ИЯ напишется около 150 строк не очень читабельного кода. Уйдет на это несколько часов.


Да ладно тебе! Есть алгоритм решения этой задачи для одного отрезка/луча/прямой. Сам реализовывал — порядка 30 строчек на С++ (зависит от форматирования, конечно ). Причем количество измерений задается длиной входного вектора координат — читаем Шикина и Борескова по части алгоритмов 3D-графики .
The God who walks is among us...
Re[11]: Сильные стороны функционального программирования
От: faulx  
Дата: 31.08.04 08:43
Оценка:
Здравствуйте, VladD2, Вы писали:

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


F>>В статье был простейший пример. Если сформулировать в общих чертах: ленивые вычисления являются средством повышения модульности. В схеме вроде "producer — consumer" модуль-producer становится более изолированным от модуля-consumer'а, соотвественно, повышается возможность его повторного использования.


VD>Что-то в упор не вижу повышения модульности от этих линивых вычислений.


Пересказываю часть статьи своими словами. Вот вспомните пример с алгоритмом альфа-бета эвристики. Если бы у нас не было в распоряжении ленивых вычислений (а точнее говоря — ленивых, потенциально бесконечных структур данных), то модуль генерации возможных позиций (дерева игры) и модуль выбора оптимального хода были бы тесно связаны между собой: либо они были бы одним модулем, либо пришлось бы вводить сущность вроде итератора, которая, опять же, тесно связана с модулем генерации дерева и т.п. С бесконечными структурами данных все просто — один модуль генерирует бесконечное дерево, другой модуль выбирает оптимальный ход с учетом этого дерева. Друг о друге эти модули ничего не знают, и не нужны им никакие итераторы — достаточно самой структуры данных.

Аналогия (все аналогии ущербны, а эту я придумал только что, но все равно приведу ее). Из крана льет вода, если его открыть и не льет, если закрыть. Тебе все равно, откуда в этом кране вода, с какой именно водонапорной башни (или что там у них) она подведена к крану. А теперь представь, что для того, чтобы принять душ, тебе надо набирать телефон водонапорной башни (это аналог итератора) и звонить туда, заказывая нужное количество воды. Ну и в какой схеме выше модульность?
Re: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 31.08.04 08:47
Оценка: +1 :)
Здравствуйте, Gaperton, Вы писали:
Корявый Janus таки отправил мессагу до того, как я ее написал. Особенно приятно, что он убивает окончательный вариант при следующей синхронизации.
Попробую вкратце написать основную претензию по материалу статьи.
Дело в том, что "Функциональное программирование называется так, потому что программа полностью состоит из функций. Сама программа тоже является функцией, которая получает исходные данные в качестве аргумента, а выходные данные выдаёт как результат."
Замечательно. Когда вы в последний раз видели такую программу? Подсказка: попробуйте перебутиться из linux в современную ОС.
Что является входом Notepad.exe? Что является ее выходом?
В статье рассмотрен пример с игрой. Увы, программа для игры должна не только вычислять оптимальный ход. За кадром осталась собственно программа — то, как она инициализирует позицию, запрашивает ход у игрока, и изменяет текущее состояние позиции. Все верно — ведь это не укладывается в рамки выбранной трактовки термина "программа".
А если мы говорим о Windows приложении? Боюсь, ограничиться только функциями не удастся.

Итого: FP подходит только для небольших частей современных программ. Пока что не видно возможности построения языка общего назначения на основе FP.
Таким образом, FP — вовсе не альтернатива IP. Некоторые черты FP можно и нужно встраивать в языки общего назначения, но они вынуждены оставаться императивными.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 31.08.04 09:12
Оценка: 1 (1)
Здравствуйте, Sinclair, Вы писали:

S>Что является входом Notepad.exe? Что является ее выходом?

Входом является _состояние_ и _событие_. Состояние — текст в редакторе до события, положение курсора etc. Событие — нажатие кнопки, клик мышки. Результат — следующее _состояние_ — с изменившися текстом, положением курсора и т.д.
В pure функцтональных языках так и делается.
Любой итеративный процесс можно преобразовать... Нет, даже не преобразовать, осмыслить как рекурсивный. И каждое состояние объекта — как значение. В pure функцтональных языках так и делается.

S>Итого: FP подходит только для небольших частей современных программ. Пока что не видно возможности построения языка общего назначения на основе FP.

S>Таким образом, FP — вовсе не альтернатива IP. Некоторые черты FP можно и нужно встраивать в языки общего назначения, но они вынуждены оставаться императивными.

В Ocaml (который является языком общего назначения на основе FP) можно использовать элементы императивности. И можно свести их к минимуму, минимизируя свойственные им проблемы. Конкретно применение императивности (т.е. изменяемых состояний) необходимо... нет, полезно, в двух случаях: интерфейсы и низкоуровневая оптимизация. Не необходио, потому что и интерфейсы можно реализовать функционально (как описано выше), а низкоуровневую оптимизацию выпихнуть в С или ассемблер. Не так уж много ее и надо.

Кстати, императивные фичи в OCaml себя чувствуют гораздо лучше, чем функциональные в ИЯ.
Re[14]: Сильные стороны функционального программирования
От: AndreyFedotov Россия  
Дата: 31.08.04 09:13
Оценка:
Здравствуйте, INTP_mihoshi, Вы писали:

INT>Тем, что для абстракции нужны паттерны. У ФЯ паттерны "родные". А ИЯ паттерны пережевывает с большим напрягом. Поэтому простейшее решение задачи в ФЯ будет, как правило, менее завязанным на частности, чем простейшее решение той же задачи на ИЯ.

Это пока типы данных простые и отношения между ними — тоже. Постройте не расчётную или коммутационную систему — а бухгалтерскую, к примеру — в ФЯ так же патерны потребуются и работать будут с таким же скрипом. Это вам не сортировку крестиком делать.
Re[15]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 31.08.04 09:21
Оценка: 1 (1) +1
Здравствуйте, AndreyFedotov, Вы писали:

AF> Это пока типы данных простые и отношения между ними — тоже. Постройте не расчётную или коммутационную систему — а бухгалтерскую, к примеру — в ФЯ так же патерны потребуются и работать будут с таким же скрипом. Это вам не сортировку крестиком делать.


А что такого страшного в этих бухгалтерских программах? Ну не понимаю я. Вроде бы, простейшая функциональная надстройка над базой данных Ну, гуй еще...
Re[3]: Ну ладно... Реальная вычислительная задача.
От: Silver_s Ниоткуда  
Дата: 31.08.04 09:41
Оценка:
Здравствуйте, Larm, Вы писали:

L>Да ладно тебе! Есть алгоритм решения этой задачи для одного отрезка/луча/прямой. Сам реализовывал — порядка 30 строчек на С++ (зависит от форматирования, конечно ). Причем количество измерений задается длиной входного вектора координат — читаем Шикина и Борескова по части алгоритмов 3D-графики .


Ну закинь тогда, если на C++ реализация есть оптимальная, посмотрим, сравним достоинства и недостатки.
Re[3]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 31.08.04 09:46
Оценка: +1
Здравствуйте, INTP_mihoshi, Вы писали:

INT>Входом является _состояние_ и _событие_. Состояние — текст в редакторе до события, положение курсора etc. Событие — нажатие кнопки, клик мышки. Результат — следующее _состояние_ — с изменившися текстом, положением курсора и т.д.

INT>В pure функцтональных языках так и делается.
Очень интересно. Было бы некисло пронаблюдать хотя бы calc.exe, написанный на FL. К сожалению, реальные приложения гораздо больше похожи на calc.exe, чем на численное интегрирование.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 31.08.04 10:11
Оценка:
Здравствуйте, Sinclair, Вы писали:

INT>>Входом является _состояние_ и _событие_. Состояние — текст в редакторе до события, положение курсора etc. Событие — нажатие кнопки, клик мышки. Результат — следующее _состояние_ — с изменившися текстом, положением курсора и т.д.

INT>>В pure функцтональных языках так и делается.
S>Очень интересно. Было бы некисло пронаблюдать хотя бы calc.exe, написанный на FL. К сожалению, реальные приложения гораздо больше похожи на calc.exe, чем на численное интегрирование.

sigh... Я ж уже кидал сюда пример кола, написанного на Ocaml с Tcl. Обыкновенный ООП пополам с ФП. На родном верблюжьем сайте caml.inria.org есть файл с примерами. Ну, вот еще примеры оттуда же, если от этого кому-нибудь будет счастье здесь

Главный список либ и программ на камле есть здесь
Списочек, кстати, нехилый весьма и весьма. Вот только бухгальтерских програм, разве что, я там и не нашел
Re[5]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 31.08.04 10:36
Оценка: +1
Здравствуйте, INTP_mihoshi, Вы писали:

INT>sigh... Я ж уже кидал сюда пример кола, написанного на Ocaml с Tcl. Обыкновенный ООП пополам с ФП. На родном верблюжьем сайте caml.inria.org есть файл с примерами. Ну, вот еще примеры оттуда же, если от этого кому-нибудь будет счастье здесь

Отлично. Возьмем, например, http://caml.inria.fr/Examples/oc/camltk/addition.ml. Что-то мне подсказывает, что вариант C# будет все-таки попрощще. Что, в общем-то, неудивительно.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 31.08.04 10:48
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Отлично. Возьмем, например, http://caml.inria.fr/Examples/oc/camltk/addition.ml. Что-то мне подсказывает, что вариант C# будет все-таки попрощще. Что, в общем-то, неудивительно.


Можешь набросать для сравнения? А то я уже его основательно забыл... Сомневаюсь, что C# выиграет больше нескольких процентов даже на своем родном поле... Даже не уверен, что выиграет вообще.

Счет в целых числах, вывод error, если обе строчки — не целые числа или пустая строка, кнопка Quit, закрывающая приложение.
Re[7]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 31.08.04 10:58
Оценка: :)
Здравствуйте, INTP_mihoshi, Вы писали:

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


S>>Отлично. Возьмем, например, http://caml.inria.fr/Examples/oc/camltk/addition.ml. Что-то мне подсказывает, что вариант C# будет все-таки попрощще. Что, в общем-то, неудивительно.


INT>Можешь набросать для сравнения? А то я уже его основательно забыл... Сомневаюсь, что C# выиграет больше нескольких процентов даже на своем родном поле... Даже не уверен, что выиграет вообще.


INT>Счет в целых числах, вывод error, если обе строчки — не целые числа или пустая строка, кнопка Quit, закрывающая приложение.


+ недеюсь разницу между WinForms и Tk тут выяснять не будем
Re[8]: Сильные стороны функционального программирования
От: Silver_s Ниоткуда  
Дата: 31.08.04 11:33
Оценка: 10 (2) +1
Здравствуйте, VladD2, Вы писали:

VD>Дык выигрыша в продуктивности (программистов) я и так добьюсь во многих областях (особенно в бизнес-софте) взяв вместо С++ тот же C#. С++ язык довольно сложный и низкоуровенвый...


С# высокоуровневый в одном аспекте. Но реально получается что при написании алгоритмов приходится париться о низкоуровневых вещах, не связаных с задачей. Если приходится портить алгоритмы ради оптимизации это не достаточно высокий уровень. Я не выгораживаю ФЯ, просто хочу сказать что проблемы не решенные есть, которые можно было бы решить при желании.

Например на C#: Есть у нас некоторый алгоритм со сложными вычислениями, выдает множество данных. Дальше еще 2 алгоритма данные обрабатывают. Хороший прием изоляции алгоритмов это векторизовать — один алгоритм считает и выдает ArrayList, другие два по очереди пробегаются по нему делают свое дело, затем этот ArrayList выбрасывается за ненадобностью.

Вот при этом начнет голова пухнуть когда будешь думать об оптимизации.
1) Можно промежуточные данные в ArrayList не сохранять, тогда все в одном месте считать — и все будет жутко криво.
2) Если же его использовать то получишь боксинг на численных типах, и затраты памяти на большом количестве данных (не известно хватит ли памяти вобще).
3) Сделать функцию вычисления произвольного элемента данных (виртуальный ArrayList). Получим жуткие тормоза при произвольном доступе — если природа итеративна и есть стартап код перед итерациями.
4) Сделать callback через делегат в цикле вычисления, либо итератор. Тогда прийдется писать специальный итератор который вперед забегает и буферизует 3 рассчитаных значения если понадобится кроме текущего элемента иметь доступ к предыдущему и следующему (не пересчитывать же одно и тоже по 3 раза). И при втором проходе прийдется снова все заново пересчитывать. А вот хочется мне в несколько проходов использовать — алгоритм упростится.

И какое отношение имеют к решаемой задаче эти вопросы. Никакого. И где тут высокий уровень?
Этим должен оптимизатор заниматься. Вобще то синтаксису ИЯ такая оптимизация не противоречит.
Увидит там компилятор бесконечный цикл заполняющий ArrayList, посмотрит а нахрена он вобще нужен? Наружу модуля не выдается, пускай выкидывает его и все использования собирает в один цикл нужной длины.
Re[2]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 31.08.04 12:14
Оценка:
S>Итого: FP подходит только для небольших частей современных программ. Пока что не видно возможности построения языка общего назначения на основе FP.
Так таки и не видно? Если уж ты начал говорить о языках без побочных эффектов (а большинство ФЯ их допускают), то Haskell и Clean — языки общего назначения, хотя там нет ничего кроме чистых функций. При этом Clean-овский IDE целиком написан на Clean, а он, при всей своей простоте, будет посложнее нотепада .

Да... Тут еще про ядерный реактор пример приводили, типа конечный автомат на ФЯ невозможно сделать. Называется, не бросайте меня в терновый куст. Так вот, мне лично было бы спокойнее, если бы управляющая программа этого реактора целиком была написана на ФЯ, и корректность ключевых модулей была-бы доказана . Я уже насмотрелся на прелести программирования "с помощью эффекта" за последние 10 лет, достало. А как вам — не знаю.
Re[3]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.09.04 03:43
Оценка:
Здравствуйте, Gaperton, Вы писали:
G>Да... Тут еще про ядерный реактор пример приводили, типа конечный автомат на ФЯ невозможно сделать. Называется, не бросайте меня в терновый куст. Так вот, мне лично было бы спокойнее, если бы управляющая программа этого реактора целиком была написана на ФЯ, и корректность ключевых модулей была-бы доказана . Я уже насмотрелся на прелести программирования "с помощью эффекта" за последние 10 лет, достало. А как вам — не знаю.
Я просто к тому, что написано в статье. В статье написано, как сделать кусок игровой программы. Не спорю, самый сложный и интересный кусок. По крайней мере, для шахматно-шашечного типа. Однако из отсутствия остальных частей программы складывается именно такое впечатление — если программа выходит за рамки stdin и stdout, то пишите ее на IL и встраивайте вызов функций, определенных на FL.
Так что неплохо бы дополнить описание того, как FP решает сложные задачи, описанием решения простых.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.09.04 05:23
Оценка:
Здравствуйте, Silver_s, Вы писали:
S_> Увидит там компилятор бесконечный цикл заполняющий ArrayList, посмотрит а нахрена он вобще нужен? Наружу модуля не выдается, пускай выкидывает его и все использования собирает в один цикл нужной длины.
Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.09.04 05:34
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

S_>> Увидит там компилятор бесконечный цикл заполняющий ArrayList, посмотрит а нахрена он вобще нужен? Наружу модуля не выдается, пускай выкидывает его и все использования собирает в один цикл нужной длины.
S> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.

Т.е. для каждой такой заплатки ждём новую версию? Тебе нравится такое решение подобных проблем?
Re[13]: Сильные стороны функционального программирования
От: Batiskaf Израиль http://www.mult.ru/
Дата: 01.09.04 05:54
Оценка: 69 (6)
Здравствуйте, VladD2, Вы писали:

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


F>>Я же говорю, в статье есть пример, очень простой, правда. Producer-у не нужно знать, когда прекращать producing данных. Соотвественну, consumer-у не нужно ничего знать о producer-е. В качестве средства коммуникации между ними служит (потенциально) бесконечный список (иногда его называют stream). Откуда он взялся, consumer-у все равно, он возьмет из него только то, что нужно. Producer-у это списка тоже неинтересно, сколько данных генерировать и когда останавливаться.


VD>Ну, и чем это ушучшает модульность по сравнению с тем же энумератором, стримом, системой передачи сообщений и т.п.?


F>>Если я не ошибаюсь, в Unix подобным образом работает кострукция program1 | program2.


VD>А в виндовс program1 > program2 и что?


VD>В общем, я только укрепился во мнении, что ленивые вычисления — это средство склаживания проблем самого функционального подхода. В ИЯ я необходимости такого механизма не вижу.


Кстати, может быть народу будет интересно глянуть уже сейчас на предполагаемый C# 3.0:
Comega project

Там кстати и стрим в роли возвращаемого значения функции применяется и ассинхронное выполнение методов, короче очень много элементов функциональных языков:


  virtual string* Foo(){
    yield return "Hello world1";
    yield return "Hello world2";
    yield return "Hello world3";  }


возвращаемое значение накапливается в выходном стриме, string* как раз и представляет собой этот стрим, судя по всему это будет комбинироваться с асинхронными вызовами, которые будут получая часть возвращаемого значения на время принимать управдения на себя и при окончании данных передавать управление снова в Foo. А вот и ассинхронные методы:


public class Buffer {
   public async Put(string s);
   public string Get() & Put(string s) { return s; }
}


Вобщем интересные штуки, классная интеграция с XML, спорная немного интеграция с SQL, и так далее. Последнее время на лицо просто повальное привлечение функциональных средств в императивные языки, те же самые атрибуты, дженерики с темплейтами, аспекты тоже рассматриваются как накладываемые функциональные блоки, происходит обогащение декларативными средствами. Да и в традиционном программинге в той же бизнес логике идеи FL проникают и туда, вот к примеру рассмотрим эту схему:

BusinessEntities.ppt

Если почитать спецификацию Business Entities модуля, то наиболее распространенное и рекомендуемое представление этого модуля это DataSet, и посмотрим на обмен стримами между функциональными блоками программы написанной на FL!

Теперь что касается мотивации по применению FL, опять же на мой взгляд. Если рассмотреть наше современное программирование, то чем постоянно занимается программист, это адаптацией структур данных из одного вида данных в другой, к примеру адаптация из данных в RDB в обьект нашего приложения, из обьекта приложения в визуальный интерфейс который описывает этот же обьект в терминах UI элементов, то есть речь идет об адаптации под любой вид ввода-вывода. Доколе будет делаться все это руками, вот мой вопрос. Ну разве не достаточно было бы описать структурно функциональную модель нашего персона, где было бы определено что поле name является одним из значений, представленных в реестре имен государства, и спроецировать ( проинтерпретировать ) эту функциональную модель на DB, понятно каким образом и с какими связями, или к примеру на UI, где понятное дело что поле Person.name исходя из функциональной модели представлено комбиком со списком всех имен с выбранным именем нашего персон. Программист же, вместо того что бы описать это единожды на уровне структуры данных своего персон переносит в ручную эти функциональные особенности своей структуры во все части приложения, в WinForms, в SQL Server, в HTML+java script, в XML, в Report, и так далее. И мало того, при разработке обьектной модели программист еще постоянно определяет новый протокол общения между модулями и обьектами своей программы, получается что его обьекты просто не совместимы своими интерфейсами с обьектами другого программиста из другого отдела или фирмы, хотя функционально эти модули могут быть вполне дополняющими друг друга, в функциональном подходе такого не может быть, протокол общения между функциональными единицами определен изначально, для того что бы одну функцию насадить на другую не нужно имплементировать какие то дивные интерфейсы с кучей абстрактных методов, из которых только может один метод тебя и интересует, тут кто то проводил аналогию с программами в Unix shell, для императивных языков такая совместимость невозможна. И потом, если мы говорим о продвинутых средствах моделирования (программирования ) сложных систем, то все упирается в средства визуального проектирования, и если представить графически кубиком на экране какой то функциональный блок я еще могу, то как представить на экране класс, который имеет свой протокол общения с окружающим миром, а может и несколько таких протоколов, и как научить наши средства визуального программирования распознавать эти протоколы для того что бы создавать программу декларативно, кубиками и стрелочками, настраивая конечную функциональность.
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[11]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.09.04 06:13
Оценка:
Здравствуйте, Курилка, Вы писали:
S>> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.

К>Т.е. для каждой такой заплатки ждём новую версию? Тебе нравится такое решение подобных проблем?

В смысле? Что именно ты называешь заплаткой? Каких проблем?
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.09.04 06:24
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

S>>> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.

К>>Т.е. для каждой такой заплатки ждём новую версию? Тебе нравится такое решение подобных проблем?

S>В смысле? Что именно ты называешь заплаткой? Каких проблем?

А Silver_s тебе не проблему описал чтоли?
yield не является её заплаткой? Т.е. фичей, которая решает проблему (с т. зр. программиста, не пользователя, естественно) в пред. версии фреймворка?
Re[13]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.09.04 08:18
Оценка: +1 :)
Здравствуйте, Курилка, Вы писали:
К>А Silver_s тебе не проблему описал чтоли?
А-а, ну описал.
К>yield не является её заплаткой?
Нет. yield является развитием языка.
К>Т.е. фичей, которая решает проблему (с т. зр. программиста, не пользователя, естественно) в пред. версии фреймворка?
Не фреймворка, а языка. Не надо все в кучу валить.

Вообще, при таком подходе, темплейты С++ являются заплаткой в третьей версии плюсов, которые решают некоторые проблемы предыдущей версии языка. А Windows NT являются заплаткой, решающей проблемы доса. Нехреновая такая заплаточка.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[11]: Сильные стороны функционального программирования
От: Павел Леонов Россия icq: 138726397
Дата: 01.09.04 08:21
Оценка:
Здравствуйте, Курилка, Вы писали:

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


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

S_>>> Увидит там компилятор бесконечный цикл заполняющий ArrayList, посмотрит а нахрена он вобще нужен? Наружу модуля не выдается, пускай выкидывает его и все использования собирает в один цикл нужной длины.
S>> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.

К>Т.е. для каждой такой заплатки ждём новую версию? Тебе нравится такое решение подобных проблем?


Это смотря как посмотреть, для ИЯ это скорее "расширение". Ты ведь не станешь утверждать, что ИЯ — это недоделанный ФЯ?
Re[14]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.09.04 08:29
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

К>>А Silver_s тебе не проблему описал чтоли?
S>А-а, ну описал.
К>>yield не является её заплаткой?
S>Нет. yield является развитием языка.
К>>Т.е. фичей, которая решает проблему (с т. зр. программиста, не пользователя, естественно) в пред. версии фреймворка?
S>Не фреймворка, а языка. Не надо все в кучу валить.

S>Вообще, при таком подходе, темплейты С++ являются заплаткой в третьей версии плюсов, которые решают некоторые проблемы предыдущей версии языка. А Windows NT являются заплаткой, решающей проблемы доса. Нехреновая такая заплаточка.


Ну тогда получаем, что при возникновениии проблемы переделываем нафиг язык чтоли? (Ну не совсем нафиг, но переделываем точно)
А кстати как с этим самым yield у васика? Если нету его, то как там это решается? И как соотносится с самим фреймворком (т.е. с реализацией в IL)?
Просто ключ. вопрос был в том, что в ФЯ это изначально предусмотрено и ни языка ни рантайма переделывать НЕ НАДО.
Re[7]: Сильные стороны функционального программирования
От: Glоbus Украина  
Дата: 01.09.04 08:30
Оценка: +1 -3
Здравствуйте, Gaperton, Вы писали:



G>Ага. "Если бы это была вещь стоящая, она за границей давно уже распространена была бы. Значит ты, дружок, ерунду придумал". Я понял принцип. Что удобно, думать не надо. Совсем. Вот, например, что я придумал, и хочу своей гениальной мыслью поделиться:


Думать как раз надо — а то потом придется всем вокруг и самому себе доказывать удобство и страшную экономическую выгоду ФЯ

G>А почему МС не использует CVS? А почему МС не юзает Java? А почему у МС серваки не под Линухом, раз ваш линух такой крутой?? А??? Ацтой ваш линух патамучта. А что это МС не испозьзует ИБМ-овские мэйнфреймы? Сейчас, соберусь с мыслями, и пойду в форумы Java и Unix.


А кто сказал что МС на юзает юникс ))) Может у них там серваки все под *никсами стоят ))) Кстати первой ос которую они разрабатывали была unix-based операционка.

G>И что прикольно, стоит МС (гипотетически) перевести разработку на ФЯ, и вообще, изменить курс как Биллу за обедом по приколу в голову взбредет, так придется говорить то же самое, но с противоположным знаком. Придется, эта, быть в курсе!


ДА пусть переводят хоть на пролог — я не на них смотрю а на то что продаваемо. По факту — на рынке программеров программист С++ ценится и востребован выше чем программер на хаскеле. Все. Программить для души на ФЯ никто не запрещает — но кормиться-то надо...И лично я, не будучи идеалистом, не поверю что все мы тут затуманены чарами пиар-отдела МС, который вкидывает бабло в С++. Рынок рано или поздно все расставит на свои метса. Вот и хаскель он поставил — в угол и на колени. Ну не продаваемый он — почему? — хрен его — может потому что реально неэффективно на нем работать. Я других причин не вижу. Все ведь в бабки упирается

G>Удивительно, а вы правда считаете, что успех продуктов микрософта как-нибудь связан с языками программирования, на которых они созданы?


Он не как-нибудь — он связан так же плотно как и с маркетингом, как и с их юзабилити и т.п. Блин, товарищ, ну ты ваще как не от мира сего! Откуда беруться ворд эксел и мс скл сервер? Программеры их пишут. На чем оин их пишут? Уж не на хаскеле точно. Все подчинено выгоде — я уже затрахался это повторять . Ты ж пойми — МС — это в первую очередь менеджмент. Грамотный менеджмент решает все. Какими бы гениальными не были программеры без организации их кпд стремиться к нулю. И в свою очередь даже с привлечением посредственностей можно добиться успеха, если их правильно организовать. Менеджерам в МС крупно посрать на всякие там сильные/слабые стороны языков и тонкости с ними связаные. Люди мыслят такими категориями: надо выпустить продукт. Для этого надо набрать программеров. Каких программеров? Которых много — то есть из которых есть что выбрать. Исторически сложилось что это программеры на плюсах. Технический консультант скажет им, можно ли на плюсах в приемлисмые сроки выпустить нужный продукт. Если бы он сказал что нельзя они бы быть может посмотрели в сторону хаскеля. Так же это могли быть программеры на паскале и т.п. Но в силу объективных причин это не программеры на хаскеле — так что ты уж прости
Удачи тебе, браток!
Re[12]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.09.04 08:31
Оценка:
Здравствуйте, Павел Леонов, Вы писали:

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


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


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

S_>>>> Увидит там компилятор бесконечный цикл заполняющий ArrayList, посмотрит а нахрена он вобще нужен? Наружу модуля не выдается, пускай выкидывает его и все использования собирает в один цикл нужной длины.
S>>> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.

К>>Т.е. для каждой такой заплатки ждём новую версию? Тебе нравится такое решение подобных проблем?


ПЛ>Это смотря как посмотреть, для ИЯ это скорее "расширение". Ты ведь не станешь утверждать, что ИЯ — это недоделанный ФЯ?


Да нет разницы как это ты назовёшь, сути-то не меняет:
есть дыры и их решают или "заплатками" или "расширениями", т.е. переделкой/доделкой изначальной функциональности
Re[7]: Сильные стороны функционального программирования
От: Glоbus Украина  
Дата: 01.09.04 08:48
Оценка:
Здравствуйте, Gaperton, Вы писали:


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


Все ты верно говришь, но если встает выбор что использовать нехило бы посоветоватсья со старшими. А советоваться затем чтобы врубиться в цену этих вещей. Как? Да очень просто — спрашиваем себя и старших, что можно сделать применяя вот это вот и что можно сделать применяя вот это вот — и сравниваем — то есть есть объективная оценка — объективная с точки зрения сложившихся культурных исторических экономических и каких-нить еще обстоятельств в которы хмы с тобой живет. А то иначе можно договориться до сферического коня в вакууме.

G>А слоны идут, известно куда. На север. Кстати, если кит на слона налезет — кто победит? ?


Вах, старик, ну ты пошутил Гаааааа — рЭальные пацаны улыбаются
Удачи тебе, браток!
Re[16]: Сильные стороны функционального программирования
От: ON  
Дата: 01.09.04 08:48
Оценка:
From: INTP_mihoshi
>функциональная надстройка над базой данных

Обычная реляционная БД это одна большая глобальная переменная.
В нормализованной БД таблицу можно рассматривать как "Лямбда ключ. ключ поле2 поле3 поле4".
Для ФЯ нужна ФБД. Вместо Лямбды сделать БетуДельту: БетаДельта = (Лямбда БД).
Posted via RSDN NNTP Server 1.9 beta
Re[15]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.09.04 08:59
Оценка: +1 :))
Здравствуйте, Курилка, Вы писали:

К>Ну тогда получаем, что при возникновениии проблемы переделываем нафиг язык чтоли? (Ну не совсем нафиг, но переделываем точно)

Ну естественно. А что, на попу сесть и плакать?
К>А кстати как с этим самым yield у васика?
Никак
К>Если нету его, то как там это решается?
Никак
К>И как соотносится с самим фреймворком (т.е. с реализацией в IL)?
Никак.
Это же фича языка!
К>Просто ключ. вопрос был в том, что в ФЯ это изначально предусмотрено и ни языка ни рантайма переделывать НЕ НАДО.
Представь себе, что у тебя нету C# 1.0. А есть сразу C#2. В нем это предусмотрено изначально, и ни языка ни рантайма переделывать не надо.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[17]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 01.09.04 09:27
Оценка:
Здравствуйте, ON, Вы писали:

ON>From: INTP_mihoshi

>>функциональная надстройка над базой данных

ON>Обычная реляционная БД это одна большая глобальная переменная.

ON>В нормализованной БД таблицу можно рассматривать как "Лямбда ключ. ключ поле2 поле3 поле4".
ON>Для ФЯ нужна ФБД. Вместо Лямбды сделать БетуДельту: БетаДельта = (Лямбда БД).

Много страшных слов... Получение информации из БД — это обыкновенная функция. Изменение БД — это функция, которая возвращает описание необходимых изменеий в нужном виде и последующая транзакция, применяющая эти изменения.
Это иожно описать в чисто фун. стиле через монады, можно использовать императивные возможности языка (если есть).

Смотри список решений здесь и одно из решений тут.

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

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


К>>И как соотносится с самим фреймворком (т.е. с реализацией в IL)?

S>Никак.
S>Это же фича языка!
Как это никак?
на IL полюбому фича ложиться должна, т.е. генерировать код в итоге, иначе смысл-то её?

К>>Просто ключ. вопрос был в том, что в ФЯ это изначально предусмотрено и ни языка ни рантайма переделывать НЕ НАДО.

S>Представь себе, что у тебя нету C# 1.0. А есть сразу C#2. В нем это предусмотрено изначально, и ни языка ни рантайма переделывать не надо.
Ага, а если потом ещё что-нибудь подобное обнаружится, надо будет думать что ни 1.0 ни 2.0 не было, а только 3.0
Re[17]: Сильные стороны функционального программирования
От: Batiskaf Израиль http://www.mult.ru/
Дата: 01.09.04 09:58
Оценка:
Здравствуйте, Курилка, Вы писали:

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


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


К>>>И как соотносится с самим фреймворком (т.е. с реализацией в IL)?

S>>Никак.
S>>Это же фича языка!
К>Как это никак?
К>на IL полюбому фича ложиться должна, т.е. генерировать код в итоге, иначе смысл-то её?

К>>>Просто ключ. вопрос был в том, что в ФЯ это изначально предусмотрено и ни языка ни рантайма переделывать НЕ НАДО.

S>>Представь себе, что у тебя нету C# 1.0. А есть сразу C#2. В нем это предусмотрено изначально, и ни языка ни рантайма переделывать не надо.
К>Ага, а если потом ещё что-нибудь подобное обнаружится, надо будет думать что ни 1.0 ни 2.0 не было, а только 3.0

По моему Sinclair немного перепутал, речь идет о Coemga, это новый диалект C#, который уже сегодня можно опробывать, компилятор все успешно компилирует без изменений в IL, вот ссылка:
Comega

там же можно стянуть бинарники Cw compiler preview. Поговаривают что возможно этот диалект станет основой для C# 3.0.
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[18]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.09.04 10:07
Оценка: :))) :)
Здравствуйте, Batiskaf, Вы писали:


B>По моему Sinclair немного перепутал, речь идет о Coemga, это ...


Ага, даёшь новый язык "Сёмга"
Re[18]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.09.04 10:17
Оценка: 1 (1)
Здравствуйте, Batiskaf, Вы писали:

B>По моему Sinclair немного перепутал, речь идет о Coemga, это новый диалект C#, который уже сегодня можно опробывать, компилятор все успешно компилирует без изменений в IL


по-моему он всё правильно говорит, вот тут почитай — http://msdn.microsoft.com/msdnmag/issues/04/05/c20/ — чётко сказано: C# 2.0
Re[8]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 01.09.04 10:51
Оценка: +4 -2
Здравствуйте, Glоbus, Вы писали:

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

G>>Ага. "Если бы это была вещь стоящая, она за границей давно уже распространена была бы. Значит ты, дружок, ерунду придумал". Я понял принцип. Что удобно, думать не надо. Совсем. Вот, например, что я придумал, и хочу своей гениальной мыслью поделиться:
G>Думать как раз надо — а то потом придется всем вокруг и самому себе доказывать удобство и страшную экономическую выгоду ФЯ
Приятно наверно считать себя умнее, а других глупее, не разбираясь при этом в предмете разговора. Но никого кроме себя ты не обманешь, потому как есть одна неувязочка, которую сложно скрыть. Ты понятия не имеешь что такое ФЯ, а в разговоре поучавствовать хочется. Именно поэтому, за отсутствием возможности поговорить о ФЯ предметно, ты переводишь разговор на МС. В общем, оставляю тебя дальше рассуждать об МС, слонах и китах капитализма, и кто кого победит. Вышепомянутые слоны идут в пеший тур в Таиланд. Надоело.
Re[10]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 01.09.04 10:59
Оценка: 1 (1) +2 -1
Здравствуйте, Sinclair, Вы писали:

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

S_>> Увидит там компилятор бесконечный цикл заполняющий ArrayList, посмотрит а нахрена он вобще нужен? Наружу модуля не выдается, пускай выкидывает его и все использования собирает в один цикл нужной длины.
S> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.
Сомнительно. Если этот yield будет иметь ленивую семантику, это будет означать неопределенный порядок вычислений. Что не является граблями только в случае, если программа состоит из чистых функций (если побочные эффекты отсутствуют). Вот собственно и все — ленивые вычисления безопасны только при отсутствии побочных эффектов, а это и есть основная отличительная характеристика ФЯ.
Re[11]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.09.04 11:38
Оценка:
Здравствуйте, Gaperton, Вы писали:
S>> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.
G>Сомнительно. Если этот yield будет иметь ленивую семантику, это будет означать неопределенный порядок вычислений. Что не является граблями только в случае, если программа состоит из чистых функций (если побочные эффекты отсутствуют). Вот собственно и все — ленивые вычисления безопасны только при отсутствии побочных эффектов, а это и есть основная отличительная характеристика ФЯ.
Ну, я так понял, что нифига там ленивые вычисления не безопасны. Надо самому следить за порядком вычислений, либо за отсутствием побочных эффектов у yield. Yield всего лишь облегчает реализацию итераторов, которые и в императивном случае вполне ленивы.
Никто мне не мешает и на C# 1.0 написать итератор, который возвращает числа Фибоначчи. Вместе с классом Fibonacci :IEnumerable, который этот итератор возвращает.
А также написать алгоритм, который получает на вход IEnumerable и проверяет, больше ли сумма ряда предопределенной константы. yield просто делает код короче.
Конечно, честные функции высшего порядка мы так не получим.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 01.09.04 11:49
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

S>>> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.
G>>Сомнительно. Если этот yield будет иметь ленивую семантику, это будет означать неопределенный порядок вычислений. Что не является граблями только в случае, если программа состоит из чистых функций (если побочные эффекты отсутствуют). Вот собственно и все — ленивые вычисления безопасны только при отсутствии побочных эффектов, а это и есть основная отличительная характеристика ФЯ.
S>Ну, я так понял, что нифига там ленивые вычисления не безопасны. Надо самому следить за порядком вычислений, либо за отсутствием побочных эффектов у yield. Yield всего лишь облегчает реализацию итераторов, которые и в императивном случае вполне ленивы.

Т.е. ничего практически строгого не получается и весь груз ответственности ложится на программера, а не на компайлер?
Что-то как-то такое решение мне не кажется особо хорошим...
Re[13]: Сильные стороны функционального программирования
От: Павел Леонов Россия icq: 138726397
Дата: 01.09.04 11:49
Оценка:
Здравствуйте, Курилка, Вы писали:


К>>>Т.е. для каждой такой заплатки ждём новую версию? Тебе нравится такое решение подобных проблем?


ПЛ>>Это смотря как посмотреть, для ИЯ это скорее "расширение". Ты ведь не станешь утверждать, что ИЯ — это недоделанный ФЯ?


К>Да нет разницы как это ты назовёшь, сути-то не меняет:


Слово за слово, глядишь а бабушка уже совсем не бабушка, а дедушка. Заплатки характерны для разработки "сверху-вниз", ИЯ исконно идет снизу-вверх.

К>есть дыры и их решают или "заплатками" или "расширениями", т.е. переделкой/доделкой изначальной функциональности


Дык Haskell или Erlang, если я не ошибаюсь, тоже не с неба свалился. Тут есть один момент. Ценность теории, модели, разработки тем больше, чем больше точек зрения рассматривалось при создании и тем они более объемны нежели плоски. Сколько человек участвовало в разрабтки Erlang?
Re[12]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 01.09.04 11:50
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

S>>> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.
G>>Сомнительно. Если этот yield будет иметь ленивую семантику, это будет означать неопределенный порядок вычислений. Что не является граблями только в случае, если программа состоит из чистых функций (если побочные эффекты отсутствуют). Вот собственно и все — ленивые вычисления безопасны только при отсутствии побочных эффектов, а это и есть основная отличительная характеристика ФЯ.
S>Ну, я так понял, что нифига там ленивые вычисления не безопасны. Надо самому следить за порядком вычислений, либо за отсутствием побочных эффектов у yield.
Я тоже понял именно так. Грабли это серьезные, имхо, хоть и действительно кажется заманчивой идеей. Тяжело писать на С# в функциональном стиле, и еще тяжелее доказать безопасность побочных эффектов. А уж гарантировать ее в затяжной разработке — будет вообще кошмар. Кто-то сделает безобидное изменение, а трое других будут неделю искать возникший глюк.

S>Yield всего лишь облегчает реализацию итераторов, которые и в императивном случае вполне ленивы.

Итераторы были-бы ленивыми, если бы значение элемента контейнера вычислялось в момент доступа к нему по итератору, т. е. было отложенным до момента чтения. Ух, какие это жесткие грабли в ИЯ! Брр!

А так — вовсе они не ленивы.

S>Никто мне не мешает и на C# 1.0 написать итератор, который возвращает числа Фибоначчи. Вместе с классом Fibonacci :IEnumerable, который этот итератор возвращает.

Ну, в общем случае — да. Никто не мешает так писать, и это в целом хороший стиль.

S>А также написать алгоритм, который получает на вход IEnumerable и проверяет, больше ли сумма ряда предопределенной константы. yield просто делает код короче.

Возможно.

S>Конечно, честные функции высшего порядка мы так не получим.

Nemerle. Получите, если захотите взять
Re[13]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.09.04 12:28
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Я тоже понял именно так. Грабли это серьезные, имхо, хоть и действительно кажется заманчивой идеей. Тяжело писать на С# в функциональном стиле, и еще тяжелее доказать безопасность побочных эффектов. А уж гарантировать ее в затяжной разработке — будет вообще кошмар. Кто-то сделает безобидное изменение, а трое других будут неделю искать возникший глюк.

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

S>>Yield всего лишь облегчает реализацию итераторов, которые и в императивном случае вполне ленивы.

G>Итераторы были-бы ленивыми, если бы значение элемента контейнера вычислялось в момент доступа к нему по итератору, т. е. было отложенным до момента чтения.
Это так и есть. Не очень понимаю, зачем итератору вычислять элементы в какой-то другой момент.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 01.09.04 12:42
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>>>Yield всего лишь облегчает реализацию итераторов, которые и в императивном случае вполне ленивы.

G>>Итераторы были-бы ленивыми, если бы значение элемента контейнера вычислялось в момент доступа к нему по итератору, т. е. было отложенным до момента чтения.
S>Это так и есть. Не очень понимаю, зачем итератору вычислять элементы в какой-то другой момент.
Не совсем так. Допустим, у тебя одна функция заполняет вектор значений, нетривиально вычисляя каждое значение.

И вот ты хочешь пробежаться по нему итератором. В "ленивой" реализации у тебя по крайней мере "ленивые" конструкторы элементов массива, так что элементы не будут на самом деле вычислены, пока ты не обратишься к ним через итератор. Вычисление будет отложено до момента чтения, который может вообще не случиться. Понимаешь разницу? Это позволяет тебе определять бесконечные (или ну очень большие) структуры данных, например.

В строгой реализации все элементы контейнера будут вычислены сразу, а итератор — ну это просто итератор. Он никакой, ни ленивый, ни строгий. Это просто акцессор, интерфейс, способ доступа. А вот контейнер — строгий.
Re[10]: Сильные стороны функционального программирования
От: Павел Леонов Россия icq: 138726397
Дата: 01.09.04 14:07
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

S_>> Увидит там компилятор бесконечный цикл заполняющий ArrayList, посмотрит а нахрена он вобще нужен? Наружу модуля не выдается, пускай выкидывает его и все использования собирает в один цикл нужной длины.
S> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.

Не, они просто хотели выделить еще одно свойство типов, про себя я ее назвал "связность". По типу доступа она либо последовательная, либо произвольная (индексированная). Они видимо решили, поскольку произвольную легче сделать и при определенной природе индексированную можно привести к последовательной, то взялись за нее и ввели индексаторы. А теперь вот и до последовательной дошло.
Re[11]: Сильные стороны функционального программирования
От: Павел Леонов Россия icq: 138726397
Дата: 01.09.04 14:09
Оценка:
Здравствуйте, Павел Леонов, Вы писали:

Опечатался.

ПЛ>Не, они просто хотели выделить еще одно свойство типов, про себя я ее назвал "связность". По типу доступа она либо последовательная, либо произвольная (индексированная). Они видимо решили, поскольку произвольную легче сделать и при определенной природе индекса индексированную можно привести к последовательной, то взялись за нее и ввели индексаторы. А теперь вот и до последовательной дошло.
Re[9]: Сильные стороны функционального программирования
От: Glоbus Украина  
Дата: 01.09.04 14:42
Оценка: +1 -4
Здравствуйте, Gaperton, Вы писали:

G>Приятно наверно считать себя умнее, а других глупее, не разбираясь при этом в предмете разговора. Но никого кроме себя ты не обманешь, потому как есть одна неувязочка, которую сложно скрыть. Ты понятия не имеешь что такое ФЯ, а в разговоре поучавствовать хочется. Именно поэтому, за отсутствием возможности поговорить о ФЯ предметно, ты переводишь разговор на МС. В общем, оставляю тебя дальше рассуждать об МС, слонах и китах капитализма, и кто кого победит. Вышепомянутые слоны идут в пеший тур в Таиланд. Надоело.


А я собственно и не скрывал своего незнания относительно ФЯ Да и потрепаться тоже как видишь не против А у тебя как видно аргументы кончились — вобщем я понял твою позицию "ФЯ лучше просто потому что они лучше и вот эти вот надуманные примеры это подтверждают, а то что конторы не используют их в промышленной разработке так это их, контор, минус"
Удачи тебе, браток!
Re[15]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 01.09.04 14:48
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


S>>>>Yield всего лишь облегчает реализацию итераторов, которые и в императивном случае вполне ленивы.

G>>>Итераторы были-бы ленивыми, если бы значение элемента контейнера вычислялось в момент доступа к нему по итератору, т. е. было отложенным до момента чтения.
S>>Это так и есть. Не очень понимаю, зачем итератору вычислять элементы в какой-то другой момент.
G>Не совсем так. Допустим, у тебя одна функция заполняет вектор значений, нетривиально вычисляя каждое значение.

Хотя, чтобы добиться такого же эффекта, ты на самом деле можешь фактически обойтись без контейнера, но заставить объект выглядеть снаружи как контейнер. Согласен, в этом смысле итераторы "ленивые".
Re[16]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 01.09.04 15:06
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


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


S>>>>>Yield всего лишь облегчает реализацию итераторов, которые и в императивном случае вполне ленивы.

G>>>>Итераторы были-бы ленивыми, если бы значение элемента контейнера вычислялось в момент доступа к нему по итератору, т. е. было отложенным до момента чтения.
S>>>Это так и есть. Не очень понимаю, зачем итератору вычислять элементы в какой-то другой момент.
G>>Не совсем так. Допустим, у тебя одна функция заполняет вектор значений, нетривиально вычисляя каждое значение.

G>Хотя, чтобы добиться такого же эффекта, ты на самом деле можешь фактически обойтись без контейнера, но заставить объект выглядеть снаружи как контейнер. Согласен, в этом смысле итераторы "ленивые".


Хм, но в этом случае ты не получишь автоматического кэширования результатов (что ты имеешь бесплатно с ленивыми типами данных), это придеться делать руками. В общем, сделать "ленивый" контейнер на C# можно, но надо смотреть в оба. Как бы потом не получилось в духе "я тебя породил, я тебя и убью".
Re[8]: Сильные стороны функционального программирования
От: ON  
Дата: 01.09.04 15:12
Оценка:
From: Glоbus
>Он не как-нибудь — он связан так же плотно как и с маркетингом, как и с их юзабилити и т.п. Блин, товарищ, ну ты ваще как не от мира сего! Откуда беруться ворд эксел и мс скл сервер? Программеры их пишут. На чем оин их пишут? Уж не на хаскеле точно.

Hejlsberg: Parts of Word, internally, use a p-code engine because it's more compact.
http://windows.oreilly.com/news/hejlsberg_0800.html

Наверняка это не p-code языка C++.
Posted via RSDN NNTP Server 1.9 beta
Re[10]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 01.09.04 15:21
Оценка: -1
Здравствуйте, Glоbus, Вы писали:

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


G>>Приятно наверно считать себя умнее, а других глупее, не разбираясь при этом в предмете разговора. Но никого кроме себя ты не обманешь, потому как есть одна неувязочка, которую сложно скрыть. Ты понятия не имеешь что такое ФЯ, а в разговоре поучавствовать хочется. Именно поэтому, за отсутствием возможности поговорить о ФЯ предметно, ты переводишь разговор на МС. В общем, оставляю тебя дальше рассуждать об МС, слонах и китах капитализма, и кто кого победит. Вышепомянутые слоны идут в пеший тур в Таиланд. Надоело.


G>А я собственно и не скрывал своего незнания относительно ФЯ Да и потрепаться тоже как видишь не против А у тебя как видно аргументы кончились — вобщем я понял твою позицию "ФЯ лучше просто потому что они лучше и вот эти вот надуманные примеры это подтверждают, а то что конторы не используют их в промышленной разработке так это их, контор, минус"


Хочешь узнать истинную причину отсутствия аргументов? Мне просто не интересно с тобой трепаться. Се ля ви.
Re[4]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 01.09.04 16:05
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

G>>Да... Тут еще про ядерный реактор пример приводили, типа конечный автомат на ФЯ невозможно сделать. Называется, не бросайте меня в терновый куст. Так вот, мне лично было бы спокойнее, если бы управляющая программа этого реактора целиком была написана на ФЯ, и корректность ключевых модулей была-бы доказана . Я уже насмотрелся на прелести программирования "с помощью эффекта" за последние 10 лет, достало. А как вам — не знаю.
S>Я просто к тому, что написано в статье. В статье написано, как сделать кусок игровой программы. Не спорю, самый сложный и интересный кусок. По крайней мере, для шахматно-шашечного типа. Однако из отсутствия остальных частей программы складывается именно такое впечатление — если программа выходит за рамки stdin и stdout, то пишите ее на IL и встраивайте вызов функций, определенных на FL.
Сам по себе ввод-вывод по природе своей императивен — там важна последовательность операций. Не стоит ждать от ФЯ чего-нибудь волшебного и волнующего, читая данные из файла. Максимум — будет необычно .

In this example, a Haskell program copies one file to another:

main = do fromHandle <- getAndOpenFile "Copy from: " ReadMode
          toHandle   <- getAndOpenFile "Copy to: " WriteMode 
          contents   <- hGetContents fromHandle
          hPutStr toHandle contents
          hClose toHandle
          putStr "Done."

getAndOpenFile          :: String -> IOMode -> IO Handle

getAndOpenFile prompt mode =
    do putStr prompt
       name <- getLine
       catch (openFile name mode)
             (\_ -> do putStrLn ("Cannot open "++ name ++ "\n")
                       getAndOpenFile prompt mode)
Re: Сильные стороны функционального программирования
От: mdw  
Дата: 01.09.04 19:06
Оценка:
Здравствуйте, Gaperton, Вы писали:

[skipped]


Другой новый вид клея, который используют функциональные языки, допускает склеивать целые программы. Напомним, что функциональная программа — просто функция из входных данных в её выходные данные. Если F и G — такие программы, то (G . F) — программа которая, вычисляет G (F input). Программа F вычисляет свой вывод, который используется как ввод, для программы G. Традиционно,это можно осуществить, сохраняя вывод F во временный файл. Проблема состоит в том, что временный файл может занять так много памяти, что непрактично склеивать программы подобным образом.



Это конечно не совсем по-существу вопроса, более шутка, но все же...

"Традиционно,это можно осуществить, сохраняя вывод F во временный файл", в смысле:
Modul1.Out >> TempFile(Googol Mb) >> Modul2.In
А каким эзотерическим способом (на обыкновенном процессоре и памяти) данные попадают из G в F в Фя?
G — это кусок маш. кода, и F тоже. Через какой астрал кусок кода F получает (Googol Mb) из G, как это нельзя сделать "традиционно"?

Сказка ложь, да в ней намек...
Re[14]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 21:20
Оценка:
Здравствуйте, Batiskaf, Вы писали:

B>Кстати, может быть народу будет интересно глянуть уже сейчас на предполагаемый C# 3.0:

B>Comega project

Сдается мен, что этот ресерч вряд ли в таком виде сможет стать третьей версией Шарпа.

B>Там кстати и стрим в роли возвращаемого значения функции применяется и ассинхронное выполнение методов, короче очень много элементов функциональных языков:


B>
B>  virtual string* Foo(){
B>    yield return "Hello world1";
B>    yield return "Hello world2";
B>    yield return "Hello world3";  }
B>


Откровенно говоря использование синтаскиса указателя для таких целей просто маразм. Да и зачем нужны все эти извраты когда во второй версии Шарпа уже есть итераторы выплняющие такую же функцию. Вот код из того же R#-а:
        /// <summary>
        /// Возвращает энумератор позволяющий перебрать элементы коллеции 
        /// в обратном порядке.
        /// </summary>
        public IEnumerator<T> GetReverseEnumerator()
        {
            for (int i = _len - 1; i >= 0; i--)
                yield return _ary[i];
        }


Чем эти "стримы" будут отличаться от энумераторов я лично не понимаю.

B>возвращаемое значение накапливается в выходном стриме, string* как раз и представляет собой этот стрим, судя по всему это будет комбинироваться с асинхронными вызовами, которые будут получая часть возвращаемого значения на время принимать управдения на себя и при окончании данных передавать управление снова в Foo. А вот и ассинхронные методы:



B>
B>public class Buffer {
B>   public async Put(string s);
B>   public string Get() & Put(string s) { return s; }
B>} 
B>


Опять таки. Сто лет как есть ассинхнонные делекаты.

B>Вобщем интересные штуки, классная интеграция с XML, спорная немного интеграция с SQL, и так далее.


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

B> Последнее время на лицо просто повальное привлечение функциональных средств в императивные языки,


Что-то не очень заметно.

B> те же самые атрибуты,


И с каких это пор атрибуты стали относиться к функциональным языкам?

B> дженерики с темплейтами,


Дженерики тоже к функциональным языкам отношения не имеют. Что-то ты уж больно много приписываешь ФЯ.

B> аспекты тоже рассматриваются как накладываемые функциональные блоки,


Ерунда какая-то. Причем тут ФЯ? Аспекты и АОП — это отдельная концепция. Может она и реализуема на ФЯ, но уж точно никаких заслуг ФЯ в АОП нет.

B> происходит обогащение декларативными средствами.


Здорово! Т.е. декларативные средства == ФЯ?! Ну, тогда записывай R# в ФЯ, хотя в нем не ФЯ и намека нет.

B> Да и в традиционном программинге в той же бизнес логике идеи FL проникают и туда, вот к примеру рассмотрим эту схему:


B>BusinessEntities.ppt


B>Если почитать спецификацию Business Entities модуля, то наиболее распространенное и рекомендуемое представление этого модуля это DataSet, и посмотрим на обмен стримами между функциональными блоками программы написанной на FL!


В общем, Остапа понесло... (с) Приписываем все достижения человечества ФЯ, находим в библии зачатки ФЯ и рисуем радужную картину будущего в которой ничего кроме ФЯ не будет.

Я вот вижу только несколько интересных идей которые несмненно со временем войдут в универсальные ИЯ. И вижу кучу проблем ФЯ котрые если не будут устранены, то не позволят ФЯ даже приблизиться к мэйнстриму.


B>Теперь что касается мотивации по применению FL, опять же на мой взгляд. Если рассмотреть наше современное программирование, то чем постоянно занимается программист, это адаптацией структур данных из одного вида данных в другой, к примеру адаптация из данных в RDB в обьект нашего приложения, из обьекта приложения в визуальный интерфейс который описывает этот же обьект в терминах UI элементов, то есть речь идет об адаптации под любой вид ввода-вывода.


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

ЗЫ

В общем, уже порядком надоело слушать восхищенные возгласы на пустом месте. Давно пора делом доказывать приимущества, а не кричать про них в духе Остапа бендера на выступлении в клубе "Четырех коней".
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 21:42
Оценка: -2 :)
Здравствуйте, Курилка, Вы писали:

К>Ага, а если потом ещё что-нибудь подобное обнаружится, надо будет думать что ни 1.0 ни 2.0 не было, а только 3.0


Ну, вот нет линивых вычислений в половине ФЯ. Но ты же первый упоро причисляешь их к фичам ФЯ в целом. Так что если в МЛ их нет, то Хаскель это встоено как поганая надстройка и все ФЯ вместе с Хаскелем никуда из-за этого не годны?
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Конечно, честные функции высшего порядка мы так не получим.


А так:

delegate int D(int i1, int i2);

int X(D d, int i1, int i2)
{
    ...
}


... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Т.е. ничего практически строгого не получается и весь груз ответственности ложится на программера, а не на компайлер?

К>Что-то как-то такое решение мне не кажется особо хорошим...

А тебе не странно что на том же ОКамле тоже есть побочные эффекты?
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка: +2 -3
Здравствуйте, Gaperton, Вы писали:

G>Я тоже понял именно так. Грабли это серьезные, имхо, хоть и действительно кажется заманчивой идеей. Тяжело писать на С# в функциональном стиле, и еще тяжелее доказать безопасность побочных эффектов. А уж гарантировать ее в затяжной разработке — будет вообще кошмар. Кто-то сделает безобидное изменение, а трое других будут неделю искать возникший глюк.


Ну, прям картина апокалипсиса. Вот толко по жизни писать на Шарпе как раз просто, а на ОКамле не очень.

Ну, нет на практике проблем там где ты их ищешь. Есть в других местах, но как раз они тебе не интересны, так как не подтверждают теорию по которой ФЯ всегда рулят.

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



Это никто не мешает сделать. Итератор по сути это класс с методом Next() и свойством Current. Никто не мешает в Next() генерировать новый элемент последовательности. Новый синтаксис просто избавляет от необходимости писать еще один класс.

G> Ух, какие это жесткие грабли в ИЯ! Брр!


Ты себе эти это специально внушаешь? Может чем тешить себя небылицами просто взять и попробоват пописать на Шарпе?

G>А так — вовсе они не ленивы.


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

S>>Никто мне не мешает и на C# 1.0 написать итератор, который возвращает числа Фибоначчи. Вместе с классом Fibonacci :IEnumerable, который этот итератор возвращает.

G>Ну, в общем случае — да. Никто не мешает так писать, и это в целом хороший стиль.

S>>А также написать алгоритм, который получает на вход IEnumerable и проверяет, больше ли сумма ряда предопределенной константы. yield просто делает код короче.

G>Возможно.

100%. yield — это синтаксический сахар. Энумераторы (IEnumerable) паттерн введенный в язык еще при его рождении.

S>>Конечно, честные функции высшего порядка мы так не получим.

G> Nemerle. Получите, если захотите взять

Все еще проще. В Шарпе есть делегаты которые позволяют передавать ссылки на функции, так что формально функции высшего порядка в шарпе делаются. В шарпе нет патерн-мотчинга, что не позволяет писать в функциональном стиле на 100%. Но писать в СТЛ-ном стиле можно легко. Вот, например, методы из коллекции R#-а:
        /// <summary>
        /// Позволяет найти элемент.
        /// </summary>
        /// <param name="predicate">
        /// Предикат поиска (делегат возвращающий true если текущий 
        /// элемент удовлетворяет критериям поиска).</param>
        /// <returns>Искомый элемент.</returns>
        public T Find(Predicate<T> predicate)
        {
            for (int i = 0; i < _len; i++)
                if (predicate(_ary[i]))
                    return _ary[i];

            return default(T);
        }

        /// <summary>
        /// Позволяет найти индекс элемента. Перебор начинается с конца списка и 
        /// продолжается до нулевого элмента.
        /// </summary>
        /// <param name="predicate">
        /// Предикат поиска (делегат возвращающий true если текущий 
        /// элемент удовлетворяет критериям поиска).</param>
        /// <returns>Искомый элемент.</returns>
        public int FindLastIndex(Predicate<T> predicate)
        {
            for (int i = _len - 1; i >= 0; i--)
                if (predicate(_ary[i]))
                    return i;
            return -1;
        }

        /// <summary>
        /// Позволяет найти индекс элемента. Перебор начинается с конца списка и 
        /// продолжается до нулевого элмента.
        /// </summary>
        /// <param name="predicate">
        /// Предикат поиска (делегат возвращающий true если текущий 
        /// элемент удовлетворяет критериям поиска).</param>
        /// <returns>Искомый элемент.</returns>
        public int FindIndex(Predicate<T> predicate)
        {
            for (int i = 0; i < _len; i++)
                if (predicate(_ary[i]))
                    return i;

            return -1;
        }
        
        
        /// <summary>
        /// <para>Позволяет выполнить некоторое действие для каждого элемента.
        /// </para>
        /// <para>Перебор осуществляется в прямом порядке.</para>
        /// </summary>
        /// <param name="action">Делегат выполняемый для каждого элемента.</param>
        public void ForEeach(Action<T> action)
        {
            for (int i = 0; i < _len; i++)
                action(_ary[i]);
        }


Вот определения делегатов (они объявлены во фрэймворке):
public delegate void Action<T>(T obj);
public delegate bool Predicate<T>(T obj);


А вот так можно применить данные методы:

SomeCollection<int> list = SomeCollection<int>(new int[]{ 1, 3, 4, 6, 9 });
int sum = 0;
// Жирным выделен анонимный метод, т.е. метод обявляемый инлайном.
// Забавно так же что можно использовать переменную sum объявленную
// в том же методе где вызывается list.ForEeach.
list.ForEeach(delegate(int elem){ sum += elem; });
Console.WriteLine(sum);

// В принципе можно вместо делегата просто передать ссылку на метод
// реализованный где угодно.
Multiplier multiplier = new Multiplier();
list.ForEeach(multiplier.Multiply);
Console.WriteLine(multiplier.Result);

...

class Multiplier
{
    public int Result = 0;
    public void Multiply(int elem)
    {
        Result *= elem;
    }
}


По большому счету не долго создать делегаты и функции вроде head(), tial(), prefix(), ... и реализовать функциональные выверты со списками. Вот только оно нафиг никому не нужно. Так как намного эффективнее и проще реализуется в императивном стиле. А вот когда функцональный становится удобнее, то можно прибегнуть и к нему.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка: -1
Здравствуйте, Gaperton, Вы писали:

Блин. Ты по русски не понимашь? Или просто не хочешь поверить в то, что ленивые вычисления в ИЯ делаются как два палца об асфальт?

Поверь итераторы не менее ленивы чем Хаскель.

И вообще, что неужели не ясно, что на ИЯ можно сделать все что угодно? В конце концов любой ФЯ в итоге выполняется на конкретном процессоре или генерирует код конкретного процессора, а любой машинный код — это по сути ИЯ.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка: -1
Здравствуйте, Gaperton, Вы писали:

G>Хотя, чтобы добиться такого же эффекта, ты на самом деле можешь фактически обойтись без контейнера, но заставить объект выглядеть снаружи как контейнер. Согласен, в этом смысле итераторы "ленивые".


Да. Долго же до тебя это доходило.

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

Энумератор это интерфейс. Выглядет примерно так:
    public interface IEnumerator<T> : System.IDisposable
    {
        T Current { get; }
        bool MoveNext();
    }


Реализоват ты его можешь как угодно. В методе MoveNext ты можешь производить любые вычисления сохраняя промежуточные резултаты в переменных-членах классов. А в свойстве Current возращать его. А можешь вообще генерировать элемент в Current, а в MoveNext просто изменять некий индекс или идентификатор который будет говорить, что нужно сгенерировать новый элемент.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


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

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

G>В общем, сделать "ленивый" контейнер на C# можно, но надо смотреть в оба. Как бы потом не получилось в духе "я тебя породил, я тебя и убью".


Ну, эта песня уже знакома. Ошибки бывают везде. Твое как бы чего не вышло — это желание не допустить логическую ошибку. Понятно, что программа с ошибкой и в африке правильно не заработает. Вот только и в фунициональном приложении логическую ошибку сделать не сложно.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка:
Здравствуйте, Gaperton, Вы писали:

G>Складские системы — одна из самых простых систем,


И сколько ты их собрал за свою жизнь?
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 22:41
Оценка:
Здравствуйте, Xentrax, Вы писали:

X>В последние годы массовую популярность завоевывали только те языки, которые накачивали бооольшими деньгами. А у С++ такая хорошая жизнь наступила из-за того, что компилятор С++ без проблем компилировал код на C (с некоторыми малозночительными "особенностями").


А С почему стал популярным? Не потому ли что на нем было написано подавляющиее бльшинство упешных ОС?

Ну, так в чем проблема написать такую ОС на одном из ФЯ? И деньги рекой сразу потеку.

Дело тут не в деньгах. А в удобстве при решени конкретных задач. Писать ОС на С/С++ куда удобнее чем на Хаскеле. Причем не из-за мега удобного синтаксиса, и из-за того что с памятью С позволяет оперировать удобно и эффективно.

X>MS обычным людям добра НЕ желает, а желает добра себе и побольше,


Экономис, былин. Все субъекты рынка работают на нем исключительно ради наживы. Но чтобы получить наживу они вынуждены делать добро другим. Так что все что прошло испытание рынком является нужным людям.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 23:26
Оценка: +3 -1
Здравствуйте, INTP_mihoshi, Вы писали:

INT>А зачем? У них и так все хорошо Ну, не выходит WinFS — и хрен с ним. Выпустим без него, все равно купят. Ну, нету генериков на шарпе. Но все равно ж писать на нем будут.


Ну, а Сан тоже зажрался? Что же они не возмут и не замутят хотя бы ту же Яву на ФЯ? А ИБМ? Им то уж точно можно было бы упростить жизнь. Они же кучу прикладных решений к своим мэйнфрэймам лабают. Прикинь! Раз и проект сдан в 4 раза быстрее и с всотню раз меньшим количеством замечаний! А лафа! Ан нет тебе. Они даже Смолток используют, но не ФЯ.

В общем, может не выдумывать сказочных историй про заговор. А просто понять, что ФЯ не созрели для коммерческого применения в тех областях где сейчас живут ИЯ.

ЗЫ

Я ничего не имею против ФЯ. Более того считаю, что многие идеи очень интересы и должны применяться в продуктах мэйнстрима. Но ненужно пиара. Лучше двигать технологии вперед и трезво оценивать ситуацию. Поймите, есть огромная разница между рекламщиной/пиаром и популяризацией идей. Последнее очень полезно и не раздражает. А первое просто таки настраивает проитв всего подхода в целом и горе-популяризаторов в частности.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 23:26
Оценка:
Здравствуйте, INTP_mihoshi, Вы писали:

INT>ах да, забыл главную причину. Фя придумали не они Вот доделают F#...


F# делается энтузиастами. И судя по его состоянию врдя ли будет доведен до коммерческого состояния. Остается надееться на то, что МС или кто то из сильных мира вего повзаимствует правильные идеи и реализует их на подобающем уровне в своих языках.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 23:26
Оценка: -3
Здравствуйте, Gaperton, Вы писали:

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


Прчти вот эту свою фразу и отнеси к себе. Почему?

G>Ты понятия не имеешь что такое ФЯ,


Да потому что ты понятие не имешь что такое экономика. А он как раз говорил тут о ФЯ не как о языках программирования, а как о товаре и инструменте на ранке. И вы показали полное незнание в данном вопросе и так и не дали внятного и разумного ответа на его вопрос. Причем лично мне совершенно ясно почему. Потому что ответ вам не выгоден.

G> а в разговоре поучавствовать хочется.


Вот вот. Не нужно этих приемчиков. А то эту тему и так читают только те кто не равнодушен к ФЯ. А после оных приемчиков останутся одни явные фанаты. Давайте как уважать друг-друга. Он ни чем не хуже тебя. И это ты не хочешь дать честного ответа на его довольно просто вопрос.

G> Именно поэтому, за отсутствием возможности поговорить о ФЯ предметно, ты переводишь разговор на МС.


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

G> В общем, оставляю тебя дальше рассуждать об МС, слонах и китах капитализма, и кто кого победит. Вышепомянутые слоны идут в пеший тур в Таиланд. Надоело.


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

ЗЫ

В общем, таким образом вы распугаете даже самых стойких людей интересующихся ФЯ. Завязывайте эту бесталковую ветку и займитесь делом. Сделайте наконец достойный документ. Сделайте его таким, чтобы его понимали люди не имеющеие специального математического образования. Я готов помогать вам в этом вопросе. И не нужно лить грязи на собеседника если он высказал неугодную вам точку зрения. Лучше найдите честные и убедительные аргументы. Или просто признайте что не все так замечательно как вы описываете. Иначе результат будет точно обратный цели.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 23:26
Оценка: +2 -1
Здравствуйте, Gaperton, Вы писали:

G>Хочешь узнать истинную причину отсутствия аргументов? Мне просто не интересно с тобой трепаться. Се ля ви.


Так не трепался бы.

Неужели ты не понял, что своим трепом в данном случае ты еще немного расширил пропасть между ФЯ и мэйнстрим-программистами?
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Сильные стороны функционального программирования
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.09.04 23:26
Оценка: :)
Здравствуйте, ON, Вы писали:

ON>Hejlsberg: Parts of Word, internally, use a p-code engine because it's more compact.

ON>http://windows.oreilly.com/news/hejlsberg_0800.html

ON>Наверняка это не p-code языка C++.


Точно Хаскеля.
... << RSDN@Home 1.1.4 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[15]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.09.04 03:47
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


G>И вот ты хочешь пробежаться по нему итератором. В "ленивой" реализации у тебя по крайней мере "ленивые" конструкторы элементов массива, так что элементы не будут на самом деле вычислены, пока ты не обратишься к ним через итератор. Вычисление будет отложено до момента чтения, который может вообще не случиться. Понимаешь разницу? Это позволяет тебе определять бесконечные (или ну очень большие) структуры данных, например.


G>В строгой реализации все элементы контейнера будут вычислены сразу, а итератор — ну это просто итератор. Он никакой, ни ленивый, ни строгий. Это просто акцессор, интерфейс, способ доступа. А вот контейнер — строгий.

Тут надо просто понять, что первичен именно итератор. А вовсе не контейнер. Числа Фибоначчи — это никакой не массив и не список. Их можно только итерировать. И та статья об этом совершенно четко говорит.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 02.09.04 03:47
Оценка: +1
Здравствуйте, mdw, Вы писали:
mdw>"Традиционно,это можно осуществить, сохраняя вывод F во временный файл", в смысле:
mdw>Modul1.Out >> TempFile(Googol Mb) >> Modul2.In
mdw>А каким эзотерическим способом (на обыкновенном процессоре и памяти) данные попадают из G в F в Фя?
mdw>G — это кусок маш. кода, и F тоже. Через какой астрал кусок кода F получает (Googol Mb) из G, как это нельзя сделать "традиционно"?

mdw>Сказка ложь, да в ней намек...

Смысл в том, что инициатива у последнего. Вместо того, чтобы вычислять данные, которые могут когда-то понадобиться, и складывать их в промежуточном виде (управление со стороны ввода), самый последний в цепочке запрашивает данные у предыдущих по мере необходимости (если она когда-нибудь возникнет).
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[16]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 02.09.04 06:18
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>И вообще, что неужели не ясно, что на ИЯ можно сделать все что угодно? В конце концов любой ФЯ в итоге выполняется на конкретном процессоре или генерирует код конкретного процессора, а любой машинный код — это по сути ИЯ.


Подумалось, кстати, что в этом смысле ФОП похоже на ООП. Т.е. в функциональом стиле, как и в объектном, можно программировать почти на всех неспециализированных языках. А ОО или ФО языки — это просто языки, семантика и прагматика которых ориентированы на соответствующий подход. Кстати, ООП и ФОП похожи еще в том смысле, что первый является эффективнысм инструментом манипулирования и инкапсулирования с точки зрения структур данных, а второй — с точки зрения алгоритмов.
Re[18]: Сильные стороны функционального программирования
От: Quintanar Россия  
Дата: 02.09.04 07:10
Оценка: +2
Здравствуйте, VladD2, Вы писали:

VD>Хаскель это встоено как поганая надстройка


С чего это ты это взял?
Re[14]: Сильные стороны функционального программирования
От: Quintanar Россия  
Дата: 02.09.04 07:14
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А тебе не странно что на том же ОКамле тоже есть побочные эффекты?


Ничего странного в этом нет. Они по-любому должны быть, поскольку иначе невозможно общаться с внешним миром. Для того, чтобы этой возможностью не злоупотребляли, было сделано так, чтобы императивно программировать на OCaml было неудобно. Реально, императивные места встречаются редко и их легко отследить.
Re[14]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.04 07:15
Оценка:
Здравствуйте, VladD2, Вы писали:

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


G>>Я тоже понял именно так. Грабли это серьезные, имхо, хоть и действительно кажется заманчивой идеей. Тяжело писать на С# в функциональном стиле, и еще тяжелее доказать безопасность побочных эффектов. А уж гарантировать ее в затяжной разработке — будет вообще кошмар. Кто-то сделает безобидное изменение, а трое других будут неделю искать возникший глюк.


VD>Ну, прям картина апокалипсиса. Вот толко по жизни писать на Шарпе как раз просто, а на ОКамле не очень.


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


Дорогой Влад, последние 6 лет я в составе команды человек в 20 занимался разработкой и поддержкой клиент серверного приложения объемом ~60 мегабайт кода (это 3-5 миллионов строк, не считая комментариев и пустых) написанного на С++, из которых 18 — моя зона ответственности. И это не какой-нибудь простой препроцессор, а сервер своей базы данных, интерпретатор всроенного языка, обработка потока котировок в реальном времени, и еще куча всего.

Поверь мне, я знаю, какие проблемы бывают на практике, а каких не бывает. И каждый, кто учавствовал в проектах размером от 100 тыщ строк, знает, какие интересные эффекты начинаются. И неделя на один дефект — это ерунда, Влад, это типичная ситуация. А бывает месяц вдвоем на один дефект. А бывает два месяца — и никакого результата.
Re[15]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 02.09.04 07:51
Оценка:
Здравствуйте, Quintanar, Вы писали:


Q>Ничего странного в этом нет. Они по-любому должны быть, поскольку иначе невозможно общаться с внешним миром. Для того, чтобы этой возможностью не злоупотребляли, было сделано так, чтобы императивно программировать на OCaml было неудобно. Реально, императивные места встречаются редко и их легко отследить.


Ну, вредительством специально никто не занимался Просто императивные возможности сделаны по "остаточному принципу", т.е. не в ущерб функциональному.

К сожалению, в OCaml даже слишком много императивщины. В том числе и в библиотеках.
Re[17]: Сильные стороны функционального программирования
От: Павел Леонов Россия icq: 138726397
Дата: 02.09.04 07:52
Оценка: +1
Здравствуйте, INTP_mihoshi, Вы писали:

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


VD>>И вообще, что неужели не ясно, что на ИЯ можно сделать все что угодно? В конце концов любой ФЯ в итоге выполняется на конкретном процессоре или генерирует код конкретного процессора, а любой машинный код — это по сути ИЯ.


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


Другими словами, писать можно и ориентированно на подход, а потом транформировать в общий код. А в поиске сбалансированного языка победят наиболее эффективные подходы или их части.
Re[3]: Сильные стороны функционального программирования
От: mdw  
Дата: 02.09.04 08:12
Оценка: +2
Здравствуйте, Sinclair, Вы писали:

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

mdw>>"Традиционно,это можно осуществить, сохраняя вывод F во временный файл", в смысле:
mdw>>Modul1.Out >> TempFile(Googol Mb) >> Modul2.In
mdw>>А каким эзотерическим способом (на обыкновенном процессоре и памяти) данные попадают из G в F в Фя?
mdw>>G — это кусок маш. кода, и F тоже. Через какой астрал кусок кода F получает (Googol Mb) из G, как это нельзя сделать "традиционно"?

mdw>>Сказка ложь, да в ней намек...

S>Смысл в том, что инициатива у последнего. Вместо того, чтобы вычислять данные, которые могут когда-то понадобиться, и складывать их в промежуточном виде (управление со стороны ввода), самый последний в цепочке запрашивает данные у предыдущих по мере необходимости (если она когда-нибудь возникнет).

Это также называется ленивыми вычислениями.

F запускается только тогда, когда G пытается прочитать некоторый ввод, и выполняется ровно столько, чтобы предоставить данные, который пытается читать G


Мне не очень понятно, почему это является особенностью именно FL(как противопоставление IL), и причем здесь вообще
L? Веб сервер исполняет работу и дает данные столько и тогда когда попросит клиент. Он не не делает ничего если нет
запроса "вот тебе аргументы (ссылка на файл) и дай мне 1024 ответа, и еще 1024, и еще..."
Мне кажется это обычное состояние дел, для разных програм и модулей внутри программ. Разве нет?
Чем в данном случае G(F) на Haskell отличается от G(F) на С (в свете lazy calculus etc)?

Кстати, здесь где-то было утверждение, что на вся программа FL состоит из функций, и сама есть функция.
А на С есть main(...) , и мне еще не приходилось писать код на C вне функций . Правда у функций есть побочные эффекты, что меняет дело. Последний абзац под флагом смайлика
Re[15]: Сильные стороны функционального программирования
От: Batiskaf Израиль http://www.mult.ru/
Дата: 02.09.04 08:28
Оценка: 9 (2) -1
Здравствуйте, VladD2, Вы писали:

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


B>>Кстати, может быть народу будет интересно глянуть уже сейчас на предполагаемый C# 3.0:

B>>Comega project

VD>Сдается мен, что этот ресерч вряд ли в таком виде сможет стать третьей версией Шарпа.

Ну вот послушай что говорит Anders Hejlsberg касательно предполагаемых фичеров в С# 3.0:
Anders Hejlsberg &mdash; Programming data in C# 3.0

Если посмотреть на то как это решено в Комеге:


    foreach( row in select cid, Sum(Freight) 
                    from c in DB.Customers 
                       left join o in DB.Orders on c.CustomerID == o.CustomerID
                    group by c.CustomerID as cid  
                    having Sum(o.Freight) > 1000.0M
                    order by Sum(Freight) 
                    ) {
       Console.WriteLine("{0,5}  {1,8}", row.cid, row[1]);
    }


да и просто на это!:

    // Use SQL Aggregates  everywhere!
    int[] series = {1, 2, 3, 4, 5, 6};    
    Console.WriteLine("\nSum of the series: {0}", Sum(series));



или такое!:

struct Address {
  struct{
    choice { string Street; int POBox; };
    string City;
    int? ZipCode;
    string Country;
  };
}

    public static void Main() {
      a = <Address>
            <Street>One Microsoft Way</Street>
            <City>Redmond</City>
            <Country>USA</Country>
          </Address>
          <Address>
            <POBox>100</POBox>
            <City>Redmond1</City>
            <Country>USA1</Country>
          </Address>;
      s = { yield return a.Street; yield return a.POBox ; yield return a.City; yield return a.ZipCode; yield return a.Country; };
      s.{Console.WriteLine(it);};
      // get Street
      string* b = a.Street;
      foreach(it in b){ Console.WriteLine("Street = {0}", it); };//энумерация всех улиц в неоднородной секвенции - в данном случае улица будет одна

      //get POBox
      int* c = a.POBox;
      foreach(it in c){ Console.WriteLine("POBox = {0}", it); };//по аналогии со Street
}



то у меня складывается впечатление что это то о чем он говорит, на канале 9 кстати кто то из участников так прямо об этом и сказал.


B>>Там кстати и стрим в роли возвращаемого значения функции применяется и ассинхронное выполнение методов, короче очень много элементов функциональных языков:


B>>
B>>  virtual string* Foo(){
B>>    yield return "Hello world1";
B>>    yield return "Hello world2";
B>>    yield return "Hello world3";  }
B>>


VD>Откровенно говоря использование синтаскиса указателя для таких целей просто маразм. Да и зачем нужны все эти извраты когда во второй версии Шарпа уже есть итераторы выплняющие такую же функцию. Вот код из того же R#-а:

VD>
VD>        /// <summary>
VD>        /// Возвращает энумератор позволяющий перебрать элементы коллеции 
VD>        /// в обратном порядке.
VD>        /// </summary>
VD>        public IEnumerator<T> GetReverseEnumerator()
VD>        {
VD>            for (int i = _len - 1; i >= 0; i--)
VD>                yield return _ary[i];
VD>        }
VD>


VD>Чем эти "стримы" будут отличаться от энумераторов я лично не понимаю.


Запись в Комеге значительно упрощается, а учитывая еще и особенности времени исполнения этой конструкции — установи комегу и отдибагируй, убедись что элемент в стриме вычисляется по ходу пьесы, в твоем же случае итерируется предварительно заполненная вычисленная последовательность, а что если для инициализации твоего массива не хватит памяти!? — то могу сказать что различия существенные.

B>> те же самые атрибуты,


VD>И с каких это пор атрибуты стали относиться к функциональным языкам?


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

B>> дженерики с темплейтами,


VD>Дженерики тоже к функциональным языкам отношения не имеют. Что-то ты уж больно много приписываешь ФЯ.

Дженерики ( в меньшей степени ), С++ темплейты в большей степени позволяют выразить алгоритм в обобщенной форме, декларативно, в конечном счете программист получает функциональный модуль, который более гибко адаптируется под конкретную предметную область. В конечном счете, если до конца придерживаться идеологии обобщенного программирования в С++, то решение задачи будет выглядеть следующим образом:

typedef Transport<HTTPProtocol, XMLContent> MyAppTransport;
typedef BizObjectContainer<StatelessStrategy, DBStorage> MyBizObjectContainer;
typedef BlaBlaAspect ...
...
...
typedef AppServerImpl< MyAppTransport, MyBizObjectContainer, ... > MyAppServerImpl;


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


B>> происходит обогащение декларативными средствами.


VD>Здорово! Т.е. декларативные средства == ФЯ?!

Да уж не императивного это точно!

B>> Да и в традиционном программинге в той же бизнес логике идеи FL проникают и туда, вот к примеру рассмотрим эту схему:


B>>BusinessEntities.ppt


B>>Если почитать спецификацию Business Entities модуля, то наиболее распространенное и рекомендуемое представление этого модуля это DataSet, и посмотрим на обмен стримами между функциональными блоками программы написанной на FL!


VD>В общем, Остапа понесло... (с) Приписываем все достижения человечества ФЯ, находим в библии зачатки ФЯ и рисуем радужную картину будущего в которой ничего кроме ФЯ не будет.


Ничего я не приписываю, просто творческое у меня мышление, умею замечать необычные вещи, проводить параллели между существующими моделями. Касательно датасетов люди подсознательно пришли к такому решению, только если ты посмотришь на ту схему что представлена в презентации, то все это можно выразить следующим образом:


Architecture = PresentationLayer( ServiceLayer( BizLogicLayer( DataAccessLayer ) ) );


единственное чего не хватает в этой формуле это BusinessEntities, который является связующим звеном между каждым модулем, который позволяет упростить протокол общения сколько бы ни было сложных модулей на столько, что общение это можно выразить такой функциональной схемой, которая еще и понятна человеку. А теперь для того что бы прочувствовать разницу возьми к примеру код начинающего программиста на ВБ, где в методе Form_Load через мощный АДО выгребаются данные из базы, и там же это все байндится на добротно имплементированные кнопки со списками, со своими листенерами и пропертями, и попробуй выразить логику такой же простой схемой. И попробуй ему обьясни что он не прав, он ведь быстро достиг результата, благодаря тому что решил все самым императивным и строгим методом, не заботясь о том, что бы этой логикой воспользовались в других местах программы. И даже если он годик подучится и научится выделять уровни, это опять же не гарантирует что его архитектура запросто опишется таким простым способом, он наломает еще много дров что бы понять что уровни не должны обмениваться кучей интерфейсов которые нужно имплементировать, где то посылать ссылки на реализации интерфейсов и абстрактных классов, научить ответную сторону принимать эти ссылки, и прочие прочие условия взаимодействия уровней системы.


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



B>>Теперь что касается мотивации по применению FL, опять же на мой взгляд. Если рассмотреть наше современное программирование, то чем постоянно занимается программист, это адаптацией структур данных из одного вида данных в другой, к примеру адаптация из данных в RDB в обьект нашего приложения, из обьекта приложения в визуальный интерфейс который описывает этот же обьект в терминах UI элементов, то есть речь идет об адаптации под любой вид ввода-вывода.


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


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

Автоматизация визуализации данных
Автор: Batiskaf
Дата: 23.08.04


VD>ЗЫ


VD>В общем, уже порядком надоело слушать восхищенные возгласы на пустом месте. Давно пора делом доказывать приимущества, а не кричать про них в духе Остапа бендера на выступлении в клубе "Четырех коней".


А мне надоело заниматься рутиной, и я пытаюсь найти решение
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[4]: Сильные стороны функционального программирования
От: Курилка Россия http://kirya.narod.ru/
Дата: 02.09.04 08:56
Оценка:
Здравствуйте, mdw, Вы писали:

mdw>Мне не очень понятно, почему это является особенностью именно FL(как противопоставление IL), и причем здесь вообще

mdw>L? Веб сервер исполняет работу и дает данные столько и тогда когда попросит клиент. Он не не делает ничего если нет
mdw>запроса "вот тебе аргументы (ссылка на файл) и дай мне 1024 ответа, и еще 1024, и еще..."
mdw>Мне кажется это обычное состояние дел, для разных програм и модулей внутри программ. Разве нет?

Имхо — нет, вебсервер в любом случае находится в цикле проверки наличия запроса, т.е. идёт "пустой цикл", а при функциональном подходе никаких таких пустых циклов нет (если, конечно, самому что-либо подобное не написать) и вычислыяется то, что именно ты сказал вчислить... Думаю где-то так
Re[16]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.04 10:03
Оценка:
Здравствуйте, Sinclair, Вы писали:

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


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


G>>И вот ты хочешь пробежаться по нему итератором. В "ленивой" реализации у тебя по крайней мере "ленивые" конструкторы элементов массива, так что элементы не будут на самом деле вычислены, пока ты не обратишься к ним через итератор. Вычисление будет отложено до момента чтения, который может вообще не случиться. Понимаешь разницу? Это позволяет тебе определять бесконечные (или ну очень большие) структуры данных, например.


G>>В строгой реализации все элементы контейнера будут вычислены сразу, а итератор — ну это просто итератор. Он никакой, ни ленивый, ни строгий. Это просто акцессор, интерфейс, способ доступа. А вот контейнер — строгий.

S>Тут надо просто понять, что первичен именно итератор. А вовсе не контейнер. Числа Фибоначчи — это никакой не массив и не список. Их можно только итерировать. И та статья об этом совершенно четко говорит.
Да ну? Так таки и не список? . А если так?
fib             = 1 : 1 : [ a+b | (a,b) <- zip fib (tail fib) ]
process list     = process1 list + process2 list + process3 list + process4 list
process fib


У меня последовательность фибонначи при выполнении process fib вычисляются один раз. При этом совершенно не важно, сколько элементов списка обрабатывает каждая из функций processN. Функция process работает со списком. Числа Фибонначи — это список. Мой код состоит из трех строк.

Напиши код с такими же характеристиками на С#. Сравним сложность.
Re[5]: Сильные стороны функционального программирования
От: mdw  
Дата: 02.09.04 10:06
Оценка:
Здравствуйте, Курилка, Вы писали:

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


mdw>>Мне не очень понятно, почему это является особенностью именно FL(как противопоставление IL), и причем здесь вообще

mdw>>L? Веб сервер исполняет работу и дает данные столько и тогда когда попросит клиент. Он не не делает ничего если нет
mdw>>запроса "вот тебе аргументы (ссылка на файл) и дай мне 1024 ответа, и еще 1024, и еще..."
mdw>>Мне кажется это обычное состояние дел, для разных програм и модулей внутри программ. Разве нет?

К>Имхо — нет, вебсервер в любом случае находится в цикле проверки наличия запроса, т.е. идёт "пустой цикл", а при функциональном подходе никаких таких пустых циклов нет (если, конечно, самому что-либо подобное не написать) и вычислыяется то, что именно ты сказал вчислить... Думаю где-то так


Тут трудно спорить есть там цикл, или нет. Может, он, начиная с socket events, и вниз до железки, ждет пока придет фрайм в адаптер, а тот ждет пока поднимут 1 на ноге чипа. Все спят...

В общем случае, то что я имел ввиду, что при G(F), F ничего не делает(не производит и не передает данных) пока не вызвана G, вне зависимости на чем это было написано.
Может термин lazy calculus подразумевает еще какое-нибудь свойство, как например, и в С(IL) и Haskell(FL) вся программа состоит из функций, но в FL функции не имеют побочных эффектов, что в корне...
Re[6]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 02.09.04 10:23
Оценка:
Здравствуйте, mdw, Вы писали:

mdw>В общем случае, то что я имел ввиду, что при G(F), F ничего не делает(не производит и не передает данных) пока не вызвана G, вне зависимости на чем это было написано.

mdw>Может термин lazy calculus подразумевает еще какое-нибудь свойство, как например, и в С(IL) и Haskell(FL) вся программа состоит из функций, но в FL функции не имеют побочных эффектов, что в корне...

Из доки по OCaml. В нем ленивые вычисления представлены в виде отдельного модуля

force x forces the suspension x and returns its result. If x has already been forced, Lazy.force x returns the same value again without recomputing it. If it raised an exception, the same exception is raised again. Raise Undefined if the forcing of x tries to force x itself recursively.

Пример ипользования

open Lazy

module Iter = 
    struct
        exception ExEnd
    
        type 'a t = Iter of 'a * 'a t Lazy.t | End
        
        let hd = function (Iter (hd, tl)) -> hd | End -> raise ExEnd
        let tl = function (Iter (hd, tl)) -> force tl | End -> raise ExEnd
        
        let rec map i f = 
            if i == End
                then End
                else Iter (f (hd i), lazy (map (tl i) f))

        let rec fold_rl i f x = 
            if i == End
                then x
                else f (fold_rl (tl i) f x) (hd i)
        
        let rec fold i f x = 
            if i == End
                then x
                else fold (tl i) f (f x (hd i)) 
                
        let rec nth i n = 
            if n==0
                then hd i 
                else nth (tl i) (n-1)

                
        let rec list l = if l==[] 
            then End 
            else Iter (List.hd l, lazy (list (List.tl l)))
        
        let rec from_random_access lenfunc getfunc ind =
            if ind >= lenfunc then End
            else Iter(getfunc ind, lazy (from_random_access lenfunc getfunc (ind+1)))
        
        let rec string s = from_random_access (String.length s) (String.get s) 0
        
    end


let si = Iter.string "Gaperton"

let g = Iter.fold si (fun s c -> String.concat "" [s; (String.make 1 (Char.uppercase c))]) ""


let it1 = Iter.list [10;20;0]

let it = Iter.map it1 (fun x -> x*2)

let s = Iter.fold it (fun x y -> x+y) 0

let s1 = Iter.nth it1 1
Re[18]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.04 10:53
Оценка:
Здравствуйте, VladD2, Вы писали:

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


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


VD>По сравнению с созданием класса реализующего итератор кэширвание просто фигня.

Не думал, что у вас создание такого класса представляет такую сложность . А у нас — вот так:
fib             = 1 : 1 : [ a+b | (a,b) <- zip fib (tail fib) ]

Напиши такое на шарпе, можешь даже воспользоваться yield. Посмотрим, позволяет-ли он определать рекурсивные типы данных. Да, кстати, насчет "не думал" — это я слукавил. Я весьма хорошо представляю себе, как это будет выглядеть (правда, без yield)

VD>К тому же в этом самом классе ты данные и будешь кэшировать. Кэшировать то нужно один элемент.

Ответ неправильный. Иногда необходимо кэшировать предыдущие. Этот пример вычисляет фибонначи эффективно — сложность O(N), как раз благодаря кэшированию серии элементов (которое происходит абсолютно прозрачно). Синклеру приводил пример, когда кэшировать надо вообще все: http://www.rsdn.ru/Forum/Message.aspx?mid=790607&amp;only=1
Автор: Gaperton
Дата: 02.09.04
.

VD>А вот как раз второй Шарп решает вообще все проблемы, так как тот самый yield устраняет как необходимость кэширования, так и создания рабочего класса.

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

Потому как насчет устранения необходимости кэширования — это еще бабка надвое сказала.

G>>В общем, сделать "ленивый" контейнер на C# можно, но надо смотреть в оба. Как бы потом не получилось в духе "я тебя породил, я тебя и убью".

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

К барьеру. Напиши код на С#, который имеет такую же характеристику, как приведенный код для фибонначи. А мы посмотрим, где проще ошибиться. Обрати внимание, что если я напишу
process1( fib ) + process2( fib ) + process3( fib )

то числа фибонначи все равно вычисляются один раз, а не три.
Re[3]: Сильные стороны функционального программирования
От: INTP_mihoshi Россия  
Дата: 02.09.04 10:56
Оценка: 2 (1)
Здравствуйте, Gaperton, Вы писали:

G>Да... Тут еще про ядерный реактор пример приводили, типа конечный автомат на ФЯ невозможно сделать. Называется, не бросайте меня в терновый куст. Так вот, мне лично было бы спокойнее, если бы управляющая программа этого реактора целиком была написана на ФЯ, и корректность ключевых модулей была-бы доказана . Я уже насмотрелся на прелести программирования "с помощью эффекта" за последние 10 лет, достало. А как вам — не знаю.


Кстати о реакторах...

Several large French corporations develop significant industrial projects in Objective Caml, including France T&#233;l&#233;com, Dassault, and CEA (<b>Commissariat &#224; l'&#201;nergie Atomique</b>).
Re[17]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.04 10:56
Оценка: +3
Здравствуйте, VladD2, Вы писали:

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


G>>Хотя, чтобы добиться такого же эффекта, ты на самом деле можешь фактически обойтись без контейнера, но заставить объект выглядеть снаружи как контейнер. Согласен, в этом смысле итераторы "ленивые".


VD>Да. Долго же до тебя это доходило.


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

Ты уверен, что я до этой мысли додуматься не мог, а не до того, что Синклер понимает под "ленивостью" итератора?
Кстати, почему ты объясняешь мне после того, как я додумался, а не до? Сейчас объяснять уже ничего не надо
Re[16]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.04 11:34
Оценка: 16 (3) +2 :)
Здравствуйте, VladD2, Вы писали:

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


VD>Блин. Ты по русски не понимашь?

Сделай сам себе замечание, ок?

VD>Или просто не хочешь поверить в то, что ленивые вычисления в ИЯ делаются как два палца об асфальт?

Конечно я не хочу в это поверить. Это не религия, а инженерное жело. У нас в предыдущем проекте вся подсистема обработки данных на С++ имеет ленивую семантику (обсчитывается то, что видно на экране, и потом кэшироется, и так в несколько слоев), и я за последние 6 лет имел возможность каждый день видеть, какой ценой это делается на ИЯ.

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

VD>Поверь итераторы не менее ленивы чем Хаскель.

Я последние 10 лет писал на ИЯ, и имею возможность сравнить сам. И вообще, зачем мне верить тебе на слово? Приведи пример, как подобает серьезным людям.

VD>И вообще, что неужели не ясно, что на ИЯ можно сделать все что угодно? В конце концов любой ФЯ в итоге выполняется на конкретном процессоре или генерирует код конкретного процессора, а любой машинный код — это по сути ИЯ.


Ясно конечно, за кого ты меня принимаешь? А тебе неужели не ясно, что "можно" и "целесообразно" разные вещи? На ассемблере можно сделать все, что угодно. Следует ли из этого, что на нем надо писать бухгалтерские программы?
Re[12]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.04 11:48
Оценка: +1
Здравствуйте, VladD2, Вы писали:

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


G>>Хочешь узнать истинную причину отсутствия аргументов? Мне просто не интересно с тобой трепаться. Се ля ви.

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

VD>Неужели ты не понял, что своим трепом в данном случае ты еще немного расширил пропасть между ФЯ и мэйнстрим-программистами?

Нет, не понял. Отвечали двадцать раз уже, приходится повторять одно и тоже. Надоело.

Если пропасть состоит в том, что мэйнстрим-программистов интересует только то, что использует МС — то ее не увеличишь и не уменьшишь разговорами. И с такими людьми, которые не слушая аргументов долдонят одно и тоже, мне разговаривать не интересно, пусть думают что хотят.
Re[10]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.04 11:58
Оценка:
Здравствуйте, VladD2, Вы писали:

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


G>>Ты понятия не имеешь что такое ФЯ,

VD>Да потому что ты понятие не имешь что такое экономика. А он как раз говорил тут о ФЯ не как о языках программирования, а как о товаре и инструменте на ранке.
Ах, так это была тонкая экономическая аналитика? Ну тогда оставляю вас и дальше рассуждать об "экономике". Напоминаю, может кто забыл — я веду беседу о ФЯ.

VD>И вы показали полное незнание в данном вопросе и так и не дали внятного и разумного ответа на его вопрос. Причем лично мне совершенно ясно почему. Потому что ответ вам не выгоден.

То что тебе всегда все ясно, ни для кого не секрет. Завидую, жить легко наверно.
А ответ на этот вопрос давался трижды немного выше по ветке. Вы его игнорируете, потому что ответ вам не выгоден.
Re[17]: Сильные стороны функционального программирования
От: Sergey Россия  
Дата: 02.09.04 12:04
Оценка:
Hello, Gaperton!
You wrote on Thu, 02 Sep 2004 11:34:39 GMT:

G> Конечно я не хочу в это поверить. Это не религия, а инженерное

G> жело. У нас в предыдущем проекте вся подсистема обработки данных на С++
G> имеет ленивую семантику (обсчитывается то, что видно на экране, и потом
G> кэшироется, и так в несколько слоев), и я за последние 6 лет имел
G> возможность каждый день видеть, какой ценой это делается на ИЯ.

G> Так вот что я тебе скажу, кроме чрезвычайной гемморойности реализации,

G> достают побочные эффекты, которые надо учитывать при любой модификации
G> проги. Напоминает "драконий покер" из книг Асприна — да, все работает
G> так, как написано, но! Если самый младший из играющих силит напротив
G> входа и сейчас второй день полнолуния — все тузы становятся девятками, а
G> дама треф играет как валет пик!

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

With best regards, Sergey.
Posted via RSDN NNTP Server 1.9 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[11]: Сильные стороны функционального программирования
От: Batiskaf Израиль http://www.mult.ru/
Дата: 02.09.04 12:05
Оценка: 2 (2) +2
Здравствуйте, Gaperton, Вы писали:

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


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


G>>>Ты понятия не имеешь что такое ФЯ,

VD>>Да потому что ты понятие не имешь что такое экономика. А он как раз говорил тут о ФЯ не как о языках программирования, а как о товаре и инструменте на ранке.
G>Ах, так это была тонкая экономическая аналитика? Ну тогда оставляю вас и дальше рассуждать об "экономике". Напоминаю, может кто забыл — я веду беседу о ФЯ.

VD>>И вы показали полное незнание в данном вопросе и так и не дали внятного и разумного ответа на его вопрос. Причем лично мне совершенно ясно почему. Потому что ответ вам не выгоден.

G>То что тебе всегда все ясно, ни для кого не секрет. Завидую, жить легко наверно.
G>А ответ на этот вопрос давался трижды немного выше по ветке. Вы его игнорируете, потому что ответ вам не выгоден.

Ало, ну зачем собачиться, ну не желает кто то понимать, ну и не надо, главное что комьюнити уже сформировалось. Давай не выступай, Чистяков, новый форум открывай, надоело уже длинные треды перематывать, будем считать что вступительная речь на открытие нового форума уже прозвучала
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[6]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.04 12:05
Оценка:
Здравствуйте, VladD2, Вы писали:

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


G>>Складские системы — одна из самых простых систем,


VD>И сколько ты их собрал за свою жизнь?

Штук 20, начиная от самых простых (маленький магазин), до достаточно сложных (магазин с полным набором торгового оборудования, оптовая торговля, производство). Примеры — Stentor, фабрика спортивных изделий Leco, издательский дом IST. Занимался этим три года, с 1997 по 1999. Еще вопросы?
Re[16]: Сильные стороны функционального программирования
От: Xentrax Россия http://www.lanovets.ru
Дата: 02.09.04 17:28
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>И вообще, что неужели не ясно, что на ИЯ можно сделать все что угодно? В конце концов любой ФЯ в итоге выполняется на конкретном процессоре или генерирует код конкретного процессора, а любой машинный код — это по сути ИЯ.


Безотносительно к теме спора, конкретно вот это высказывание напоминает споры C/С++/Pascal vs assembler несколько лет назад — "на ассемблере и макросах можно сделать все то же, что и на С++, даже лучше"
Re[10]: Сильные стороны функционального программирования
От: ON  
Дата: 02.09.04 17:39
Оценка: :)
From: VladD2 rsdn www.optim.ru/cs
>Точно Хаскеля.

Хаскель не хаскель, а какой смысл использовать интерпретатор если функции не конструировать динамически. Посмотрел я Word.exe, 10 мег, никаких следов оптимизации по объему не заметил, искал слова вроде defun, нашел много раз повторяющиеся одни и те же справочники, если в unicode посмотреть, там даже есть "Целую" и "Получателю сего"
Posted via RSDN NNTP Server 1.9 beta
Re[7]: Сильные стороны функционального программирования
От: mdw  
Дата: 02.09.04 19:06
Оценка:
Здравствуйте, INTP_mihoshi, Вы писали:

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


mdw>>В общем случае, то что я имел ввиду, что при G(F), F ничего не делает(не производит и не передает данных) пока не вызвана G, вне зависимости на чем это было написано.

mdw>>Может термин lazy calculus подразумевает еще какое-нибудь свойство, как например, и в С(IL) и Haskell(FL) вся программа состоит из функций, но в FL функции не имеют побочных эффектов, что в корне...

INT>Из доки по OCaml. В нем ленивые вычисления представлены в виде отдельного модуля


INT>force x forces the suspension x and returns its result. If x has already been forced, Lazy.force x returns the same value again without recomputing it. If it raised an exception, the same exception is raised again. Raise Undefined if the forcing of x tries to force x itself recursively.


INT>Пример ипользования

[skipped]
INT>

С OCaml или другими ФЯ, к сожалению, не знаком. А синтаксис, с налету, не очень привычен. Так что пример я не совсем понял.
Но судя по тексту из "доки по OCaml", это что-то вроде:

int f(int i)
{
    static int nLastArg = INV_VAL, nLastRes = INV_VAL;
    
    if (i == nLastArg)
        return nLastRes; //or rethrow exception, whatever

    ..... 
}


Disclaimer: догадываюсь, что это я чего-то не понимаю . Очень хотелось бы понять в чем фокус. То есть что в lazy calculus такого, что делает его возможным в ФЯ, и трудно воплотимым в ИЯ.
Re[8]: Сильные стороны функционального программирования
От: Batiskaf Израиль http://www.mult.ru/
Дата: 02.09.04 19:38
Оценка:
Здравствуйте, mdw, Вы писали:

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


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


mdw>>>В общем случае, то что я имел ввиду, что при G(F), F ничего не делает(не производит и не передает данных) пока не вызвана G, вне зависимости на чем это было написано.

mdw>>>Может термин lazy calculus подразумевает еще какое-нибудь свойство, как например, и в С(IL) и Haskell(FL) вся программа состоит из функций, но в FL функции не имеют побочных эффектов, что в корне...

INT>>Из доки по OCaml. В нем ленивые вычисления представлены в виде отдельного модуля


INT>>force x forces the suspension x and returns its result. If x has already been forced, Lazy.force x returns the same value again without recomputing it. If it raised an exception, the same exception is raised again. Raise Undefined if the forcing of x tries to force x itself recursively.


INT>>Пример ипользования

mdw>[skipped]
INT>>

mdw>С OCaml или другими ФЯ, к сожалению, не знаком. А синтаксис, с налету, не очень привычен. Так что пример я не совсем понял.

mdw>Но судя по тексту из "доки по OCaml", это что-то вроде:

mdw>
mdw>int f(int i)
mdw>{
mdw>    static int nLastArg = INV_VAL, nLastRes = INV_VAL;
    
mdw>    if (i == nLastArg)
mdw>        return nLastRes; //or rethrow exception, whatever

mdw>    ..... 
mdw>}
mdw>


mdw>Disclaimer: догадываюсь, что это я чего-то не понимаю . Очень хотелось бы понять в чем фокус. То есть что в lazy calculus такого, что делает его возможным в ФЯ, и трудно воплотимым в ИЯ.


Можно поставить Comega, его синтаксис более привычен, и подибагировать как это все работает, вот к примеру такой код:


int* FromTo(int b, int e){
    for (i = b; i <= e; i++) 
       yield return i; 
  }

  foreach(int i in FromTo(0,10)) {
     Console.WriteLine(i);
  }


Comega реализует все на closure, то есть в foreach встраивается экземпляр функционального обьекта ( ты его увидишь в отладчике, да и в IL сборке тоже найдешь ), в инстансе которого сохраняется весь контекст метода, метод возвращает стрим, это как бы сиквенция, которая совместима с семантикой итерации, с той лишь разницей что содержимое этой сиквенции не вычисляется одним махом, как в традиционном C#, а запрашивается по мере необходимости, с каждой новой итерацией foreach будет передаваться управление в FromTo closure, и именно с того места, на котором прервали выполнения раньше, тоесть вычисляет следующее значение сиквенции, которое затем распечатывается. Вот посмотри еще другие примеры: Cw Overview
Will I live tomorrow? Well I just can't say
But I know for sure — I don't live today.
Jimi Hendrix.
Re[8]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 03.09.04 11:26
Оценка:
mdw>Disclaimer: догадываюсь, что это я чего-то не понимаю . Очень хотелось бы понять в чем фокус. То есть что в lazy calculus такого, что делает его возможным в ФЯ, и трудно воплотимым в ИЯ.

Не трудно воплотимым, а опасным.

Ленивые вычисления (lazy evaluation) состоят в следующем.
В обычном (строгом) языке все аргументы функции f( x1, ..., xN ) вычисляются до вызова f.
При ленивом вызове все наоборот. Аргументы не вычисляются, пока не будут фактически использованы.
Это означает произвольный порядок вычисления аргументов, причем он может отличаться от вызова к вызову.
Функции-аргументы тоже могут быть ленивыми. Отсюда следует, что порядок вычислений в ленивом языке вообще не является фиксированным и заранее не определен.

Конструкторы типов тоже являются ленивыми функциями, что позволяет работать с бесконечными и рекурсивно определенными данными (не типами! А именно данными). Вот многострадальные числа Фибонначи:
fib             = 1 : 1 : [ a+b | (a,b) <- zip fib (tail fib) ]

Здесь определяется список чисел Фибонначи, ссылаясь сам на себя.
tail list — список без первого элемента
zip list1 list2 — преобразует пару списков в список пар значений.

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

Это означает, что язык должен предоставлять соответствующий "синтаксический сахар", чтобы было удобно обходиться без модифицирующих операций. Такой язык будет являеться "функциональным".
Re[9]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.09.04 12:55
Оценка:
Здравствуйте, Gaperton, Вы писали:
G>Это означает, что язык должен предоставлять соответствующий "синтаксический сахар", чтобы было удобно обходиться без модифицирующих операций. Такой язык будет являеться "функциональным".
Ну кстати плюсы содержат модификатор const, который при должном уважении к нему позволяет четко провести границу между модифицирующими и консервативными операциями. Теоретически, мы могли бы построить компилятор, применяющий ленивые техники там, где возможно, и работающий императивно в остальных случаях.

Хотспоттящий компилер мог бы идентифицировать лидеров консервативных вызовоа для обеспечения кэширования.
Многострадальные числа фибоначчи в твоем примере съедят всю доступную память при банальном поиске элемента, большего некоторой константы. Тупые некэширующие итераторы .Net победят благодаря отсутствию кэшировния, но продуют как только алгоритм потребует хотя бы второго прохода по той же последовательности. Ясно, что решение о кэшировании лучше принимать с учетом предполагаемого использования, а не встраивать в язык.
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Сильные стороны функционального программирования
От: Nick_ Россия  
Дата: 03.09.04 13:06
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Многострадальные числа фибоначчи в твоем примере съедят всю доступную память при банальном поиске элемента, большего некоторой константы.


С чего бы?
Результат функции f(x1,x2,...) хранится в памяти до тех пор, пока он кому-то нужен. Если алгоритм поиска линейно перебирает числа фибоначи, то в памяти будет храниться только два числа.
PS: я про haskell
Re[11]: Сильные стороны функционального программирования
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.09.04 13:45
Оценка:
Здравствуйте, Nick_, Вы писали:

N_>С чего бы?

N_>Результат функции f(x1,x2,...) хранится в памяти до тех пор, пока он кому-то нужен. Если алгоритм поиска линейно перебирает числа фибоначи, то в памяти будет храниться только два числа.
N_>PS: я про haskell
Ну, это я от невежества. Я правильно понимаю, что речь идет о сборке мусора?
... << RSDN@Home 1.1.4 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 03.09.04 14:01
Оценка:
Здравствуйте, Sinclair, Вы писали:

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


N_>>С чего бы?

N_>>Результат функции f(x1,x2,...) хранится в памяти до тех пор, пока он кому-то нужен. Если алгоритм поиска линейно перебирает числа фибоначи, то в памяти будет храниться только два числа.
Все так.

S>Я правильно понимаю, что речь идет о сборке мусора?

Абсолютно . Стоит отметить, что сборщики мусора с "поколениями" работают эффективнее при отсутствии модифицирующих операций.
Re[12]: Сильные стороны функционального программирования
От: Nick_ Россия  
Дата: 03.09.04 14:15
Оценка: 94 (6)
S>Ну, это я от невежества. Я правильно понимаю, что речь идет о сборке мусора?

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

PS: В современных оптимизирующих компиляторах Си, Си++ и Фортрана программа преобразуется в промежуточную форму. Обычно это SSA форма (Single Static Assignment). А SSA в свою очередь эквивалентна функциональной программе.
http://citeseer.ist.psu.edu/appel98ssa.html
Re[10]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 03.09.04 14:26
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

G>>Это означает, что язык должен предоставлять соответствующий "синтаксический сахар", чтобы было удобно обходиться без модифицирующих операций. Такой язык будет являеться "функциональным".
S>Ну кстати плюсы содержат модификатор const, который при должном уважении к нему позволяет четко провести границу между модифицирующими и консервативными операциями. Теоретически, мы могли бы построить компилятор, применяющий ленивые техники там, где возможно, и работающий императивно в остальных случаях.
Будет ли это удобно, вот в чем вопрос. Nemerle, ссылку на который я тебе посылал, это шарпы, с добавленым функциональным синтаксическим сахаром. Вот это — один из практичных вариантов. Только там нет ленивых вычислений. Думаю, их можно добавить. По крайней мере, ленивые списки.

S>Хотспоттящий компилер мог бы идентифицировать лидеров консервативных вызовоа для обеспечения кэширования.

S>Многострадальные числа фибоначчи в твоем примере съедят всю доступную память при банальном поиске элемента, большего некоторой константы. Тупые некэширующие итераторы .Net победят благодаря отсутствию кэшировния, но продуют как только алгоритм потребует хотя бы второго прохода по той же последовательности. Ясно, что решение о кэшировании лучше принимать с учетом предполагаемого использования, а не встраивать в язык.
Боже упаси, кто тебя заставляет кэшировать? В конце концов, можно и как-нибудь так:
fib_create = (1, 0)
fib_number (current, _) = current
fib_next (current, prev) = (current + prev, current)

А хочешь — можешь определить класс типов (ADT) для числовых последовательностей, и сделать его реализацию для Фибонначи. Свобода, понимаешь. Как хочешь, так и делай.
Re[13]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 03.09.04 14:33
Оценка:
Здравствуйте, Nick_, Вы писали:


S>>Ну, это я от невежества. Я правильно понимаю, что речь идет о сборке мусора?


N_>Нет. В хаскеле это делается во время компиляции.

N_>Когда вы пишите программу на функциональном языке, то описываете не последовательность действий, а то, как пеередаются и обрабатываются ваши данные. Компилятор строит граф потока данных и по нему генерирует код.
N_>Сборка мусора подключается только тогда, когда компилятор не может разобраться с временем жизни "объекта".
Прикольно. Так работают все G-машины, или это зависит от реализации? Пришлешь ссылки?
Кстати, Фортран
От: eugals Россия  
Дата: 03.09.04 15:51
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


Кстати, о "чистых" функциях, я вдруг вспомнил...
В Фортране'95 они тоже есть! Так модификатор и назвали PURE.

real pure function toReal( x)
    real*4, intent(IN) :: x

    toReal = REAL( x)
end function


А вот какие от них радости:

A pure procedure can be used in contexts where other procedures are restricted; for example:

  • It can be called directly in a FORALL statement or be used in the mask expression of a FORALL statement.
  • It can be called from a pure procedure. Pure procedures can only call other pure procedures.
  • It can be passed as an actual argument to a pure procedure. (вот вам и функции высших порядков )

  • Кроме того, AFAIR, эти pure-функции являются ещё и intrinsic, то есть их можно вызывать при инициализации констант и значение будет вычислено уже на этапе компиляции

    А ещё, есть такая разновидность pure-функций, как ELEMENTAL. Им, в качестве аргумента, можно подавать как простые числа, так и массивы, а они уж вернут результирующий обработанный массив, причем, насколько я вкурил, это всё будет выполне без создания копии вектора. То есть, компилятор сам постарается отложить фактическое выделение памяти под объекты до того момента, когда без этого уже никуда. Как ни крути, а похоже это они самые и есть — lazy evaluationы!
    То же самое и с оператором FORALL, который специально заточен под эти самые pure-функции — там тоже что-то такое ленивое было, теперь уж и не вспомню...

    Так-то вот. Пожалуй пора и Фортран зачислять в функциональные языки...
    ... << RSDN@Home 1.1.3 stable >>
    Re[19]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:51
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    VD>>Хаскель это встоено как поганая надстройка


    Q>С чего это ты это взял?


    Тяжело говорить с людьми не умеющими понять, что собеседник демострирует абсурдность их логики.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[15]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:51
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    VD>>А тебе не странно что на том же ОКамле тоже есть побочные эффекты?


    Q>Ничего странного в этом нет. Они по-любому должны быть, поскольку иначе невозможно общаться с внешним миром. Для того, чтобы этой возможностью не злоупотребляли, было сделано так, чтобы императивно программировать на OCaml было неудобно.


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

    Q>Реально, императивные места встречаются редко и их легко отследить.


    Рельно и на Окамле, и на Шарпе можно нафигачить такой обратной связи на этих самых побочных эффектах, что "мама не горюй". Но если отбросить предположение, что программировать должны дебилы, то станет понятно, что это гипертрофированные страхи не имеющие ничего с рельной жизнью. Побочные эффекты в функциях это плохо и их избегают все грамотные люди. А побочные эффекты в методах — это то ради чего они созданы и глупо их баяться.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[16]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:51
    Оценка:
    Здравствуйте, INTP_mihoshi, Вы писали:

    INT>К сожалению, в OCaml даже слишком много императивщины. В том числе и в библиотеках.


    Это жизнь. Небыло бы там "императивщины", небыл бы Окамл сравнимым по проивзодительности с ИЯ.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[19]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:51
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Не думал, что у вас создание такого класса представляет такую сложность . А у нас — вот так:

    G>
    G>fib             = 1 : 1 : [ a+b | (a,b) <- zip fib (tail fib) ]
    G>

    G>Напиши такое на шарпе, можешь даже воспользоваться yield. Посмотрим, позволяет-ли он определать рекурсивные типы данных. Да, кстати, насчет "не думал" — это я слукавил. Я весьма хорошо представляю себе, как это будет выглядеть (правда, без yield)

    Для меня этот пример не более чем набор "палочек". Опиши что хочешь получить словами.

    Что же касается рекурсивных типов данных, то ты опсываешь функцию, а не данные. Данные могут ссылаться на себя, но не могут быть сами пос себе рекурсивными. Чудес не бывает.

    G>Ответ неправильный.


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

    G> Иногда необходимо кэшировать предыдущие.


    Кто-то запрещает?

    G> Этот пример вычисляет фибонначи эффективно — сложность O(N),


    Да плевать всем на фиборачи. В мирной жизни такая лабуда не встречается. Если ФЯ для математиков, то дальше разговаривать нечего. У них и у всех остальных задачи кардинально разные.

    G> как раз благодаря кэшированию серии элементов (которое происходит абсолютно прозрачно). Синклеру приводил пример, когда кэшировать надо вообще все: http://www.rsdn.ru/Forum/Message.aspx?mid=790607&amp;only=1
    Автор: Gaperton
    Дата: 02.09.04
    .


    Блин. Если надо, то значит надо. Или в ФЯ все святым духом делается?

    Ты утверждаешь, что на ФЯ нельзя создать линивых вычислений. Вот тебе пример примитивного варианта:

    class A
    {
        int _value = 0;
        public void Next() { ++_value; }
        public int Current() { return _value; }
    }
    
    ...
    
    A a = new A();
    for (;;a.Next())
    {
        ... a.Current() ...
    }


    Что это по твоему не линивые вычисления? Нужно обязательно создать список из всех допустимых значений?

    Ну, раз линивые, то закроем этот спор. Признай что сморозил глупость.

    G>Возможно. На самом деле "ленивые потоки" — наименее опасный вид ленивых вычислений. Это вполне можно включить в императивный язык, как синтаксический сахар и приятную мульку. Но и только.


    А только и нужно. Все остальное для теоритиков.

    G>Потому как насчет устранения необходимости кэширования — это еще бабка надвое сказала.


    Да пускай она все что хочешь говрир. Ты за ней не повторяй.

    G> К барьеру. Напиши код на С#, который имеет такую же характеристику, как приведенный код для фибонначи. А мы посмотрим, где проще ошибиться. Обрати внимание, что если я напишу

    G>
    G>process1( fib ) + process2( fib ) + process3( fib )
    G>

    G>то числа фибонначи все равно вычисляются один раз, а не три.

    Может уже прямо сразу написать тебе сферического коня в вакууме? Меня твои абстракции уже малость достали. Ты бы написал что-нибудь мнее абстрактное и сравнил бы. А то постоянно цитаты из учебников ничего с жизнью общего не имеющие и те все как один демонстрируют прблемы ФЯ. Взялся быструю сортировку показать, и сразу проблемы. По месту массив отсотрировать не удается. Взять элемент из середины списка таоже. В итоге кода больше, а эффективность меньше. В общем, сплошная антиреклама.

    Проблема ФЯ в том, что для жизни на них очень тяжело задачу найти. Библиотеки все черт знает для чего предназначены. Сравнить с тем же фрймворком ну, никак не получается. Давно вот говорю перепишите тесты из шустриков. Хоть что-то можно будет сопоставить. К примеру, вот крайне выгодный для ФЯ тест рассчета ПИ:
    public static string pi(int digits)
    {
        if (digits > 54900)
            throw new System.Exception("n must be <= 54900");
        
        StringBuilder pi = new RStringBuilder(digits);
        string[] zero = { "0", "00", "000" };
        int d = 0, e, b, g, r;
        int c = (digits / 4 + 1) * 14;
        int[] a = new int[c];
        int f = 10000;
    
        for(int i = 0; i < a.Length; i++)
            a[i] = 20000000;
    
        while((b = c -= 14) > 0)
        {
            d = e = d % f;
    
            while(--b > 0)
            {
                d = d * b + a[b];
                g = (b << 1) - 1;
                a[b] = (d % g) * f;
                d /= g;
            }
    
            r = e + d / f;
    
            if (r < 1000)
                pi.Append(zero[r > 99 ? 0 : r > 9 ? 1 : 2]);
            pi.Append(r.ToString());
        }
        return pi.ToString();
    }
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[17]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:51
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Конечно я не хочу в это поверить. Это не религия, а инженерное жело. У нас в предыдущем проекте вся подсистема обработки данных на С++ имеет ленивую семантику (обсчитывается то, что видно на экране, и потом кэшироется, и так в несколько слоев),


    Ну, а зачем тогда глупости утверждать?

    G> и я за последние 6 лет имел возможность каждый день видеть, какой ценой это делается на ИЯ.


    А может у вас все же не в бобине проблемы были? Да и С++ сам по себе проблем создает выше крыши. Я вот на С++ тоже много проблем имел. А на Шарпе как-то не очень. Все больше алгоритмические и проетные. И при изменениях ничего не разваливается.

    VD>>Поверь итераторы не менее ленивы чем Хаскель.

    G>Я последние 10 лет писал на ИЯ, и имею возможность сравнить сам. И вообще, зачем мне верить тебе на слово? Приведи пример, как подобает серьезным людям.

    Примеры тебе уже тут приводились. Да ты и сам признал что линивые вычисления не являются монополией ФЯ. Так что даказывать нечего.

    G>Ясно конечно, за кого ты меня принимаешь?


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

    G> А тебе неужели не ясно, что "можно" и "целесообразно" разные вещи?


    Можно цитатут где бы ты говорил о целесообразности? Ты тут утверждал о невозможности. Вот теперь идешь на попятные. Про целесообразность вспомнил вот...

    G> На ассемблере можно сделать все, что угодно. Следует ли из этого, что на нем надо писать бухгалтерские программы?


    Нет конечно. Это прерогатива ФЯ.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[18]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:51
    Оценка:
    Здравствуйте, Sergey, Вы писали:

    S>Воистину так. Я тоже однажды решил сэкономить чуть-чуть на спичках (лень

    S>было расчитывать, когда надо вид обновлять, а когда нет) и завяз в
    S>отложенных вычислениях по самые уши, когда код слегка разросся.

    И естествнно даже не задумался, над тем что нужно было более тщательно все спроектировать... Переписал все на ФЯ и все само сабой заработала. Причем быстрее белее и пушистее...
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[17]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:51
    Оценка:
    Здравствуйте, Xentrax, Вы писали:

    X>Безотносительно к теме спора, конкретно вот это высказывание напоминает споры C/С++/Pascal vs assembler несколько лет назад — "на ассемблере и макросах можно сделать все то же, что и на С++, даже лучше"


    Если ты заметил я даже не заикался об удобстве. Просто раздражает откровенный гон о том, что можно и чего нельзя.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[15]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:51
    Оценка: -2
    Здравствуйте, Gaperton, Вы писали:

    G>Дорогой Влад, последние 6 лет я в составе команды человек в 20 занимался разработкой и поддержкой клиент серверного приложения объемом ~60 мегабайт кода (это 3-5 миллионов строк, не считая комментариев и пустых) написанного на С++, из которых 18 — моя зона ответственности. И это не какой-нибудь простой препроцессор, а сервер своей базы данных, интерпретатор всроенного языка, обработка потока котировок в реальном времени, и еще куча всего.


    Рад за тебя. Вот только кроме тебя были и другие люди пишущие код. И у некоторых из них он таки работал.

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


    Ну, прям обучение неумелого щенка не тыкаться носом в стену. Поверь участвал я в более менее больших проектах. Не 60 мег но все же. И проблемы видел. То что ты все время говоришь о плюсах и о своем неудачном опитые всего лишь говорит о том, что твои скилы на плюсах меньше чем нужно чтобы решить данную проблему. Собственно я даже не спорю, что писать большие проекты на С++ задача не простая. И что С++ вообще не самый лучший язык с точки зрения простоты и отладки. Но на плюсах свет клином не сошелся. Есть и дуругие языки у которых нет такого вороха проблем и такой сложности. Ты все время давишь на сложность отладки. А я за последние годы за отладкой больше двух часов к ряду (над одной проблемой) не сидел. Причем если засиживался дольше минуты, то это были сложные зависимости в алгоритмах. Сложность заключалась в том, чтобы понять ситуацию. А вот с побочными эффектами и прочей лабудой о которой ты все время толдычешь пролем нет! Дольше 5 митут на отладку подобных проблем у меня не уходит. Так что оставь эти песни для других.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[7]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:51
    Оценка: -3
    Здравствуйте, Gaperton, Вы писали:

    VD>>И сколько ты их собрал за свою жизнь?

    G>Штук 20, начиная от самых простых (маленький магазин), до достаточно сложных (магазин с полным набором торгового оборудования, оптовая торговля, производство). Примеры — Stentor, фабрика спортивных изделий Leco, издательский дом IST. Занимался этим три года, с 1997 по 1999. Еще вопросы?

    Что-то не верится судя по словам. Я этим занимался лет 7 и прекрасно знаю, что создать достойную учетную систему задача непростая. В прочем... похоже ты просто любишь "крикнуть" какую-нибудь глупость по громче, чтобы другие по возмущались.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[13]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:52
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    VD>>Так не трепался бы.

    G>Я и не треплюсь. В отличие от некоторых, я веду предметные разговоры.

    Я плякль...

    G>Если пропасть состоит в том, что мэйнстрим-программистов интересует только то, что использует МС — то ее не увеличишь и не уменьшишь разговорами. И с такими людьми, которые не слушая аргументов долдонят одно и тоже, мне разговаривать не интересно, пусть думают что хотят.


    Значит не понял. Ну, тут ничего не поделашь.

    ЗЫ

    Кстати, об МС. Они спонсируют разработку в МСРесерче аж трех ФЯ (#F — Окамл для дотнета, SML.NET и GHC). И видимо когда вся эта лабуда созреет, возмут ее на вооружение, или возмут из нее правильные идеи и добавят в тот же Шарп. МС из тех кто хорошо воплощает в жизнь правильные (чужие) идеи. Так что то что они не используют ФЯ как раз хорошее доказательство их сырости. Идеи джита и промежуточного языка были придуманы в 70-ые. Но только сегодня Сан и МС воплощают их в жизнь на высоком техническом уровне. Думаю, что с идеями ФЯ, вроде функций высшего порядка и паттерн-матчингом будет тоже самое. Просто всему свое время.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:52
    Оценка: -2
    Здравствуйте, Gaperton, Вы писали:

    VD>>Да потому что ты понятие не имешь что такое экономика. А он как раз говорил тут о ФЯ не как о языках программирования, а как о товаре и инструменте на ранке.

    G>Ах, так это была тонкая экономическая аналитика? Ну тогда оставляю вас и дальше рассуждать об "экономике". Напоминаю, может кто забыл — я веду беседу о ФЯ.

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

    VD>>И вы показали полное незнание в данном вопросе и так и не дали внятного и разумного ответа на его вопрос. Причем лично мне совершенно ясно почему. Потому что ответ вам не выгоден.

    G>То что тебе всегда все ясно, ни для кого не секрет. Завидую, жить легко наверно.

    Ну, советовать смотреть в зеркало снова будет как-то банально.
    В обещм, не стоит переводить стрелки...

    G>А ответ на этот вопрос давался трижды немного выше по ветке. Вы его игнорируете, потому что ответ вам не выгоден.


    Ответа небыло. Была разведена трехэтажная демагогия с оскорблениями. Мол ты пацан вообще молчи. Ты в вопрсе не шариш и нефига на МС пенять.

    Эдак тебе можно в твоем стиле ответить. "Ты мужик гонишь много пурги, а кто ты такой чтобы тебя слушть? Не имени, не завния...". Не думаю, что тебе стане приятнее или ты посчиташь слова от этого более доказательными.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[12]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:52
    Оценка: -1
    Здравствуйте, Batiskaf, Вы писали:

    B>Ало, ну зачем собачиться, ну не желает кто то понимать, ну и не надо, главное что комьюнити уже сформировалось. Давай не выступай, Чистяков, новый форум открывай, надоело уже длинные треды перематывать, будем считать что вступительная речь на открытие нового форума уже прозвучала


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

    Принципиальное решение уже принято. И команда, и комьюнити за. Хотя команда далеко не единогласна.

    Поверьте мне на слово, что без качественной затравки в виде статейки ничего хорошего не выйдет.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[17]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:52
    Оценка:
    Здравствуйте, INTP_mihoshi, Вы писали:

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


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

    Более того если приглядеться, то языки делаются интересными какими-то фичами и их сочетанием (сбалансированностью).
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[18]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:52
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Ты уверен, что я до этой мысли додуматься не мог, а не до того, что Синклер понимает под "ленивостью" итератора?


    А ты уверен, что понял? А то последующие посты твои наводят на обратную мысль.

    G>Кстати, почему ты объясняешь мне после того, как я додумался, а не до? Сейчас объяснять уже ничего не надо


    А ты поднимись по веточке вверх...
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re: Кстати, Фортран
    От: Nick_ Россия  
    Дата: 04.09.04 03:53
    Оценка:
    Здравствуйте, eugals, Вы писали:

    E>Так-то вот. Пожалуй пора и Фортран зачислять в функциональные языки...


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

    Зачислять фортран в функциональные языки наверное не стоит, но по уровню абстракции он немного выше языка Си.
    Re[7]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 03:53
    Оценка: -1
    Здравствуйте, INTP_mihoshi, Вы писали:

    http://caml.inria.fr/Examples/oc/camltk/addition.ml. Что-то мне подсказывает, что вариант C# будет все-таки попрощще. Что, в общем-то, неудивительно.

    INT>Можешь набросать для сравнения? А то я уже его основательно забыл... Сомневаюсь, что C# выиграет больше нескольких процентов даже на своем родном поле... Даже не уверен, что выиграет вообще.


    INT>Счет в целых числах, вывод error, если обе строчки — не целые числа или пустая строка, кнопка Quit, закрывающая приложение.


    Если я правильно понял задачу (разобрать все эит кракозябры я так и не смог), то примерно так:
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    class Form1 : Form
    {
        private Label   _result      = new Label();
        private TextBox _textBoxVal1 = new TextBox();
        private TextBox _textBoxVal2 = new TextBox();
        private Label   _label2      = new Label();
        private Label   _label3      = new Label();
        private Button  _calc        = new Button();
        private Button  _quit        = new Button();
    
        public Form1()
        {
            _result.SetBounds(21, 24, 35, 14);
            _textBoxVal1.SetBounds(74, 24, 72, 20);
            _textBoxVal2.SetBounds(170, 24, 70, 20);
            _label2.SetBounds(56, 24, 11, 14);
            _label3.SetBounds(152, 27, 11, 14);
            _calc.SetBounds(247, 24, 66, 22);
            _quit.SetBounds(247, 54, 66, 22);
            ClientSize = new Size(354, 80);
    
            _textBoxVal1.Text = "1";
            _textBoxVal2.Text = "2";
            _calc.Text        = "&Calc";
            _quit.Text        = "&Quit";
    
            _quit.Click += delegate(object sender, EventArgs e) { Close(); };
            _calc.Click += delegate(object sender, EventArgs e)
            {
                try
                {
                    _result.Text = (int.Parse(_textBoxVal1.Text)
                                    + int.Parse(_textBoxVal2.Text)).ToString();
                }
                catch
                {
                    _result.Text = "Error";
                }
            };
    
            Controls.AddRange(new Control[]
            {_quit, _calc, _label3, _label2, _textBoxVal2, _textBoxVal1, _result});
        }
    }


    Если не короче, то точно понятнее. А если учесть, что в рельной жизни все делается визуально и писать нужно только:
                try
                {
                    _result.Text = (int.Parse(_textBoxVal1.Text)
                                    + int.Parse(_textBoxVal2.Text)).ToString();
                }
                catch
                {
                    _result.Text = "Error";
                }

    то вообще говорить не очем.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[14]: Сильные стороны функционального программирования
    От: Nick_ Россия  
    Дата: 04.09.04 03:55
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Прикольно. Так работают все G-машины, или это зависит от реализации? Пришлешь ссылки?


    Конечно, зависит от реализации. С сылками у меня полный бардак, я только начинаю с этим всем разбираться. Может, если все-таки появится форум, то что-нибудь пришлю.
    Re[16]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 04.09.04 09:48
    Оценка:
    Q>>Ничего странного в этом нет. Они по-любому должны быть, поскольку иначе невозможно общаться с внешним миром. Для того, чтобы этой возможностью не злоупотребляли, было сделано так, чтобы императивно программировать на OCaml было неудобно.

    VD>Ну, то есть мы сошлись на едином мнении о том, что все слова об ужасах побочных эффектов — это притянутая за уши фигня?


    Нет. Не в этом дело. Я писал одну немаленькую программу на SML (часть компилятора) и, хотя я использовал там императивные фичи, проблем с ними я не имел. Поскольку они были изолированы в коде и привести к ошибкам не могли, поскольку их использование носило вспомогательный характер. Соответственно проблемы с side-effects не было.

    Q>>Реально, императивные места встречаются редко и их легко отследить.


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


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

    В OCaml ситуция другая. Там принят другой способ вызова функций — по значению, а не по имени (т.е. когда параметры функции вычисляются только в случае необходимости) и поэтому проблем с императивщиной там меньше. Компилятор может сам понять, есть ли side-effects в данной функции. Но в целом они там нужны только для ввода-вывода, каких-то вычислительных задач типа сортировки и хранения глобального состояния программы, чтобы не таскать его по всему коду в качестве аргумента.
    Re[20]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 04.09.04 12:05
    Оценка:
    VD>Ты утверждаешь, что на ФЯ нельзя создать линивых вычислений. Вот тебе пример примитивного варианта:

    VD>
    VD>class A
    VD>{
    VD>    int _value = 0;
    VD>    public void Next() { ++_value; }
    VD>    public int Current() { return _value; }
    VD>}
    
    VD>...
    
    VD>A a = new A();
    VD>for (;;a.Next())
    VD>{
    VD>    ... a.Current() ...
    VD>}
    VD>


    VD>Что это по твоему не линивые вычисления? Нужно обязательно создать список из всех допустимых значений?


    VD>Ну, раз линивые, то закроем этот спор. Признай что сморозил глупость.


    Естественно, в С# можно эмулировать ленивые вычисления, точно так же, как на ассемблере можно писать в объектно ориентированном стиле. Вопрос насколько это красиво, удобно и понятно. Ленивые вычисления в Haskell'е врожденная черта. Чтобы ими пользоваться не нужно предпринимать никаких дополнительных действий, думать как да что. Вот, например, вычисление простых чисел методом решета:

    nums = [2..] -- бесконечный список чисел начиная с 2 
    sieve (head:tail) = head : sieve (filter (\x -> if x `mod` head = 0 then False else True) tail) 
    -- просеивание списка, (\x -> if x `mod` head = 0 then False else True) - это функция, которая
    -- возвращает False, если x делится нацело на head и True иначе. filter - это функция, которая
    -- фильтрует список tail c помощью указанной функции. После чего просеивание производится по отношению
    -- к новому списку, из которого удалены все элементы, делящиеся на head,
    primes = sieve nums -- все простые числа

    Во всех этих 3-х строках кода неявно подразумевается ленивость вычислений. В реальности ни списки не будут бесконечно большими, ни filter не будет обрабатывать весь список и sieve тоже.
    Re[13]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.09.04 13:18
    Оценка:
    2Lloyd: У тебя конвульсии или ты случайно на минус все время попадаешь? Это уже как-то не серьезно.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[14]: Сильные стороны функционального программирования
    От: INTP_mihoshi Россия  
    Дата: 04.09.04 14:20
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>2Lloyd: У тебя конвульсии или ты случайно на минус все время попадаешь? Это уже как-то не серьезно.


    Рефлекс на нарушение пятого пункта полиси
    Re[14]: Сильные стороны функционального программирования
    От: ON  
    Дата: 04.09.04 15:13
    Оценка:
    From: Gaperton http://www.livejournal.com/users/gaperton
    >Так работают все G-машины, или это зависит от реализации? Пришлешь ссылки?

    А можно ссылку на G-машину?

    Тут еще одна тонкость. Я придумал еще одну редукцию: если типы предполагают небольшое число значений, можно их все подставить в выражение, вычислить результаты, получим просто значения. Затем попытаться подобрать для этого ряда чисел снова формулу. В худшем случае получим один большой match, тоже полезная вещь в качества кэша, а может быть и получится свернуть в более компактную формулу. Такое нигде не работает?
    Posted via RSDN NNTP Server 1.9 beta
    Re[20]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 04.09.04 15:46
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    VD>>>Хаскель это встоено как поганая надстройка

    Q>>С чего это ты это взял?
    VD>Тяжело говорить с людьми не умеющими понять, что собеседник демострирует абсурдность их логики.
    ...не зная при этом Хаскеля, о чем открыто заявляет. Браво.
    Re[18]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 04.09.04 15:50
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    X>>Безотносительно к теме спора, конкретно вот это высказывание напоминает споры C/С++/Pascal vs assembler несколько лет назад — "на ассемблере и макросах можно сделать все то же, что и на С++, даже лучше"


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

    Ты как в очередной раз споришь сам с собой, выдумывая что говорит собеседник. Это на самом деле начинает уже раздражать. Никто не говорил про "нельзя". Речь о том, что ленивые вызовы опасны при наличии побочных эффектов. Может ты начнешь наконец тратить время на чтение сообщений?
    Re[15]: Сильные стороны функционального программирования
    От: Nick_ Россия  
    Дата: 04.09.04 16:01
    Оценка: 3 (1)
    Здравствуйте, ON, Вы писали:

    ON>From: Gaperton http://www.livejournal.com/users/gaperton

    >>Так работают все G-машины, или это зависит от реализации? Пришлешь ссылки?

    ON>А можно ссылку на G-машину?


    Припоминаю только описание STG-машины
    http://citeseer.ist.psu.edu/peytonjones92implementing.html
    Есть еще обзорная статья по абстрактным машинам
    http://citeseer.ist.psu.edu/diehl00abstract.html
    Re[14]: Сильные стороны функционального программирования
    От: Lloyd Россия  
    Дата: 04.09.04 18:47
    Оценка: 6 (1) +1
    Здравствуйте, VladD2, Вы писали:

    VD>2Lloyd: У тебя конвульсии или ты случайно на минус все время попадаешь? Это уже как-то не серьезно.


    2VladD2: нет, это не конвульсии и не случайность. это адекватная реакция на твое хамское неуважение к аппонентам.
    ... << RSDN@Home 1.1.4 @@subversion >>
    Re[16]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 04.09.04 19:01
    Оценка: 4 (1)
    Здравствуйте, VladD2, Вы писали:

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


    G>>Дорогой Влад, последние 6 лет я в составе команды человек в 20 занимался разработкой и поддержкой клиент серверного приложения объемом ~60 мегабайт кода (это 3-5 миллионов строк, не считая комментариев и пустых) написанного на С++, из которых 18 — моя зона ответственности. И это не какой-нибудь простой препроцессор, а сервер своей базы данных, интерпретатор всроенного языка, обработка потока котировок в реальном времени, и еще куча всего.


    VD>Рад за тебя. Вот только кроме тебя были и другие люди пишущие код. И у некоторых из них он таки работал.

    Эта система успешно работает более 10 лет . Четыре фермы серверов, самая крупная — в Чикаго.

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

    VD>Ну, прям обучение неумелого щенка не тыкаться носом в стену. Поверь участвал я в более менее больших проектах. Не 60 мег но все же. И проблемы видел. То что ты все время говоришь о плюсах и о своем неудачном опитые всего лишь говорит о том, что твои скилы на плюсах меньше чем нужно чтобы решить данную проблему.
    Я эксперт по С++ . И ведущий специалист компании по архитектуре данного приложения, sardonix не даст соврать. Работает оно великолепно, Влад, для приложения такого объема написанного на С++. Опыт у нас исключительно положительный. И за последние 5 лет накоплена большая статистика по дефектам production-а, чтобы можно было достоверно говорить о причинах этих дефектов. Через меня и мою группу их прошла примерно тысяча (часть которых была вызвана тем, что SQA запутались в требованиях) — точно посмотреть не могу, т. к. пишу из дома.

    VD>Собственно я даже не спорю, что писать большие проекты на С++ задача не простая. И что С++ вообще не самый лучший язык с точки зрения простоты и отладки.

    Не сложнее, чем на С#, если конечно умеешь пользоваться языком. Вот уж с чем нет проблем, так это с управлением памятью, если руки растут откуда надо (если придерживаться строгой ownership policy). Ну, и работая с С++ не стоит увлекаться COM-объектами. И все будет в порядке.

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

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

    VD> А я за последние годы за отладкой больше двух часов к ряду (над одной проблемой) не сидел. Причем если засиживался дольше минуты, то это были сложные зависимости в алгоритмах.

    Потому, что сидел над своим кодом, который тебе знаком.

    VD> Сложность заключалась в том, чтобы понять ситуацию. А вот с побочными эффектами и прочей лабудой о которой ты все время толдычешь пролем нет! Дольше 5 митут на отладку подобных проблем у меня не уходит. Так что оставь эти песни для других.

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

    Подобные проблемы имеют обыкновение выглядеть как сложные зависимости в алгоритмах. А вообще, при исправлении дефектов всегда сложность состоит в том, чтобы понять ситуацию. И при неопределенном порядке вычислений и наличии побочных эффектов это очень сложно. Часто приходится встраивать в программу trace, ждать несколько дней, когда ситуация повторится, а потом долго разбирать trace, сопоставляя с кодом (чаще всего чужим, и правленным несколькими людьми), и пытаясь сообразить, как такое могло получиться. И ты знаешь, иногда (редко) понять не получается, и приходится применять симптоматическое лечение — клиенты ждать не хотят!

    Кстати, может прекратим "меряться пиписьками"? А то ты меня провоцируешь.
    Re[16]: Сильные стороны функционального программирования
    От: Lloyd Россия  
    Дата: 04.09.04 19:22
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Ну, прям обучение неумелого щенка не тыкаться носом в стену. Поверь участвал я в более менее больших проектах. Не 60 мег но все же. И проблемы видел. То что ты все время говоришь о плюсах и о своем неудачном опитые всего лишь говорит о том, что твои скилы на плюсах меньше чем нужно чтобы решить данную проблему. Собственно я даже не спорю, что писать большие проекты на С++ задача не простая. И что С++ вообще не самый лучший язык с точки зрения простоты и отладки. Но на плюсах свет клином не сошелся. Есть и дуругие языки у которых нет такого вороха проблем и такой сложности. Ты все время давишь на сложность отладки. А я за последние годы за отладкой больше двух часов к ряду (над одной проблемой) не сидел. Причем если засиживался дольше минуты, то это были сложные зависимости в алгоритмах. Сложность заключалась в том, чтобы понять ситуацию. А вот с побочными эффектами и прочей лабудой о которой ты все время толдычешь пролем нет! Дольше 5 митут на отладку подобных проблем у меня не уходит. Так что оставь эти песни для других.


    Влад, а можно вопрос личного характера?

    У тебя в профайле написано, что ты являешься техническим редактором журнала и насколько я помню, это у тебя в профайле по крайней пере пару лет уже записано. Судя по пикче, которая у тебя в профайле же, тебе не очень много лет. Думаю вряд ли взрослый серьезный человек будет в качестве своего фото пихать картинку из компьютерной игры. По моим прикидкам тебе вряд ли получается больше чем 25-27 лет. Вычтем из этого возраста 2 года, что ты являешься техническим редактором журнала. Получается, плотно программированием ты занимался максимум до 23-25 лет, т.к. после этого ты был уже не программистом. Думаю, наверняка у тебя высшее образование, т.е. плотно работать ты начал в лучшем случае где-то в 22 года. Путем насложной арифметики получаем, что плотно программирование ты занимался не больше 3-х лет.

    Тебе не кажется, что такой скромный опыт не дает тебе оснований делать столь безаппеляционные выводы и утверждения которые от тебя постоянно слышат участники форума?
    ... << RSDN@Home 1.1.4 @@subversion >>
    Re[8]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 04.09.04 21:53
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    VD>>>И сколько ты их собрал за свою жизнь?

    G>>Штук 20, начиная от самых простых (маленький магазин), до достаточно сложных (магазин с полным набором торгового оборудования, оптовая торговля, производство). Примеры — Stentor, фабрика спортивных изделий Leco, издательский дом IST. Занимался этим три года, с 1997 по 1999. Еще вопросы?

    VD>Что-то не верится судя по словам. Я этим занимался лет 7 и прекрасно знаю, что создать достойную учетную систему задача непростая.

    Ну кто-то может и двадцать лет этим заниматься, и так и не понять, как такие вещи делать просто. А там на самом деле существует простая технология. Я бы с тобой поделился, но ...
    VD> В прочем... похоже ты просто любишь "крикнуть" какую-нибудь глупость по громче, чтобы другие по возмущались.
    ...после такого, не считаю возможным продолжать беседу. Потому как ты совсем охренел.
    Re[9]: Сильные стороны функционального программирования
    От: Batiskaf Израиль http://www.mult.ru/
    Дата: 05.09.04 08:50
    Оценка: +3
    Здравствуйте, Gaperton, Вы писали:

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


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


    VD>>>>И сколько ты их собрал за свою жизнь?

    G>>>Штук 20, начиная от самых простых (маленький магазин), до достаточно сложных (магазин с полным набором торгового оборудования, оптовая торговля, производство). Примеры — Stentor, фабрика спортивных изделий Leco, издательский дом IST. Занимался этим три года, с 1997 по 1999. Еще вопросы?

    VD>>Что-то не верится судя по словам. Я этим занимался лет 7 и прекрасно знаю, что создать достойную учетную систему задача непростая.

    G>Ну кто-то может и двадцать лет этим заниматься, и так и не понять, как такие вещи делать просто. А там на самом деле существует простая технология. Я бы с тобой поделился, но ...

    VD>>В прочем... похоже ты просто любишь "крикнуть" какую-нибудь глупость по громче, чтобы другие по возмущались.

    G>...после такого, не считаю возможным продолжать беседу. Потому как ты совсем охренел.



    О как у вас все запущено.

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

    И вообще, ребята, давайте будем более терпимыми в отношении приверженцев других культур, религий, технологий и подходов, я понимаю что монотеистическое существование общества накладывает отпечатки на мышление и на стиль отношений с другими "конфессиями", от этого очень сложно отделаться всем без исключения, но давайте включим рационализм, свойственный программерам, и скажем себе что от того что кто то будет применять ФЯ ничего плохого не случится, равно как и от того, что кто то будет работать исключительно на ИЯ, в этом нет никакой ереси и крамолы.
    Will I live tomorrow? Well I just can't say
    But I know for sure — I don't live today.
    Jimi Hendrix.
    Re: Сильные стороны функционального программирования
    От: prVovik Россия  
    Дата: 05.09.04 10:25
    Оценка:
    У меня появилось нестерпимое желание вставить свои пять копеек в этот очень интересный разговор, что я сейчас и сделаю

    Вот несколько мыслей о жизни, все ИМХО, и если я не прав, поправте меня.

    Начну из далека. Как всем хорошо известно, совпеменное ПО характеризуется высокой сложностью. Разрешить сложность таких систем можно с помощью декомпозиции их на мелкие и следовательно простые части. Эту самую декомпозицию можно проводить различными способами, причем задача декомпозиции сама по себе весьма нетривиальна. Исторически первым подходом к решению данной проблемы была структурная декомпозиция. Поначалу всё было хорошо, и все были довольны. Но время шло и ПО становилось все сложнее и сложнее. Выяснилось, что сделать эффективную декомпозицию сложной системы с помощью структурного подхода крайне трудно. Поэтому, был предложен объектно-ориентированный сбособ декомпозиции сложной системы, имеющий ряд весомых преимуществ по сравнению со стуктурным. На данный момент, ООД является доминирующим подходом, что будет дальше неизвестно. Напомню вкраце основные принципы ООП. Система состоит из объектов и каждый объект имеет изменяемое состояние. Он может посылать сообщения другим объектам и тем самым вызывать изменение их состояния.

    По всему видно, что использование ООД в чистых ФЯ затруднительно. А что же ФЯ предлагают в замен? А ничего.Приходится использовать старую структурную декомпозицию. Иногда этого хватает, например в случае с телекомом, но далеко не всегда.

    Читая эту ветку, у меня сложилось впечатление, что основной лейтмотив защитников ФЯ таков: "ввиду наличия состояний программы написанной на императивном языке, её труднее отлаживать и сопровождать, поэтому надо перейти к ФЯ, лишенных этих недостатков". Можно провести аналогию с таким утверждением: "Автомобили загрязняют атмосферу, поэтому надо перейти на велосипеды". Эти утверждения выглядят вполне логично, но есть одно "НО". Можно ли применять велосипеды в той же мере, в какой применяются автомобили? Очевидно, что не всегда. Но можно говорить о рамках применимости. Это же касается и ФЯ. Так, например, я считаю, что ФЯ плохо подходят для разработки мощного текстового редактора, типа ворда (я не имею ввиду "экстремальный спорт", понятно что "раком" можно и до Китая доскакать).

    И еще пара замечаний.

    1) Окружающий мир по своей природе императивен и непрерывно изменчив. Электроны вертятся вокруг ядра, молекулы находятся в броуновском движении, Земля вращается вокруг Солнца, люди рождаются и умирают и т.д. В этом смысле ФЯ не имеют ничего общего с реальным миром, они являются исключительно плодом человеческого воображения. Поэтому, ФЯ мало подходят для моделирования предметной области, связанной с окружающим миром, например для бухгалтерских систем.

    2) Человек мыслит императивно. Если у Вас спросить, как приготовить чай, что вы ответите? Вы опишете последовательность действий: налить в чайник воду, вскипятить и пр. Врядли кто-то опишет набор функций,каскадный вызов которых приведет к появлению чая. То есть ИЯ ближе к человеческому мышлению, и, следовательно,более доступны ему.
    лэт ми спик фром май харт
    Re[2]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 05.09.04 11:50
    Оценка: 6 (1) :)
    Здравствуйте, prVovik, Вы писали:

    V> По всему видно, что использование ООД в чистых ФЯ затруднительно. А что же ФЯ предлагают в замен? А ничего.Приходится использовать старую структурную декомпозицию. Иногда этого хватает, например в случае с телекомом, но далеко не всегда.


    ФЯ много чего предлагают, в том числе и объекты как OCaml. В Haskell'е есть классы типов, например, и монады.

    V>1) Окружающий мир по своей природе императивен и непрерывно изменчив. Электроны вертятся вокруг ядра, молекулы находятся в броуновском движении, Земля вращается вокруг Солнца, люди рождаются и умирают и т.д. В этом смысле ФЯ не имеют ничего общего с реальным миром, они являются исключительно плодом человеческого воображения. Поэтому, ФЯ мало подходят для моделирования предметной области, связанной с окружающим миром, например для бухгалтерских систем.


    Бездоказательные утверждения. В чем конкретно императивен мир? Разве есть какое-то глобальное состояние мира, которое дискретно меняется каждый такт времени?

    V>2) Человек мыслит императивно. Если у Вас спросить, как приготовить чай, что вы ответите? Вы опишете последовательность действий: налить в чайник воду, вскипятить и пр. Врядли кто-то опишет набор функций,каскадный вызов которых приведет к появлению чая. То есть ИЯ ближе к человеческому мышлению, и, следовательно,более доступны ему.


    В современной алгебре широко используется теория категорий, которая пришла на смену "императивной" теории множеств. А ФЯ основаны на лямбда исчислении, которое имеет прямую связь с так называемыми декартово-замкнутыми категориями. Так что бытовому разуму может быть императивный подход и ближе, но когда речь заходит о решении реально сложных задач, функциональный подход оказывается предпочтительней.
    Кроме того, я сомневаюсь в императивности человеческого мышления вообще и уж точно оно не объектно-ориентированное. Лично я, когда думаю как приготовить чай, ищу решение проблемы отталкиваясь от предполагаемого результата. Т.е. нужен чай => нужна горячая вода и сам чай => нужно согреть воду => нужно набрать воду и т.д. Это не императивный подход.
    Re[10]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 05.09.04 18:04
    Оценка:
    B>О как у вас все запущено.

    B>Будь добр, поделись со мной, и с другими, если это конечно не очень секретная информация, которая может быть передана исключительно Чистякову, при условии его личной заинтересованности.

    RUP.

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

    У меня предложение попроще, способное на порядок поднять культуру общения. Давайте Чистякоа перестанет хамить и переходить на личности. Объясни это Чистякову. Я ему недавно объяснял подробно, он видимо не понимает.
    Re[14]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 05.09.04 19:14
    Оценка: +1
    Здравствуйте, VladD2, Вы писали:

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


    VD>>>Так не трепался бы.

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

    G>>Если пропасть состоит в том, что мэйнстрим-программистов интересует только то, что использует МС — то ее не увеличишь и не уменьшишь разговорами. И с такими людьми, которые не слушая аргументов долдонят одно и тоже, мне разговаривать не интересно, пусть думают что хотят.


    VD>Значит не понял. Ну, тут ничего не поделашь.

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

    Репутацию свою ты уже не испортишь, а, как говорил поручик Ржевский, "можно и впердолить".
    Re[21]: Сильные стороны функционального программирования
    От: WolfHound  
    Дата: 05.09.04 20:17
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    Q>Во всех этих 3-х строках кода неявно подразумевается ленивость вычислений. В реальности ни списки не будут бесконечно большими, ни filter не будет обрабатывать весь список и sieve тоже.

    А теперь давай сравним производительность с этим
    Re[2]: Решение в лоб мы решето Эратосфена
    Автор: WolfHound
    Дата: 23.06.04


    Вот результаты
    Re[3]: Решение в лоб мы решето Эратосфена
    Автор: WolfHound
    Дата: 24.06.04

    ЗЫ Зы я знаю что сравнение не корректоно ибо у тебя алгоритм "в лоб"
    ЗЗЫ А теперь попробуй на ФЯ написать решето эратосфена и так чтобы памяти жрало не больше чем моя реализация
    ... << RSDN@Home 1.1.4 rev. 142 >>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[22]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 05.09.04 21:00
    Оценка: 8 (1) :)
    Здравствуйте, WolfHound, Вы писали:

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


    Q>>Во всех этих 3-х строках кода неявно подразумевается ленивость вычислений. В реальности ни списки не будут бесконечно большими, ни filter не будет обрабатывать весь список и sieve тоже.

    WH>А теперь давай сравним производительность с этим
    WH>Re[2]: Решение в лоб мы решето Эратосфена
    Автор: WolfHound
    Дата: 23.06.04

    WH>
    WH>Вот результаты
    WH>Re[3]: Решение в лоб мы решето Эратосфена
    Автор: WolfHound
    Дата: 24.06.04

    WH>ЗЫ Зы я знаю что сравнение не корректоно ибо у тебя алгоритм "в лоб"
    WH>ЗЗЫ А теперь попробуй на ФЯ написать решето эратосфена и так чтобы памяти жрало не больше чем моя реализация

    На интерпретаторе (!) ghci под Windows на моей не самой быстрой машине первые 5000 (до 48619) чисел вычислились за 40 секунд, что примерно в 2 раза быстрее, чем на твоей программе . Знаю, знаю. Твоя программа сразу знала верхний предел и поэтому вычеркивала числа сразу до него . Но что же делать, я то имел ввиду ленивые вычисления, и моя программа могла бы быть написана более эффективно, если бы был задан верхний предел. Т.е. задачи решаются разные. Для сравнения нужна программа, которая заранее не знает сколько от нее потребуют простых чисел.
    Кстати, OCaml, думаю, вообще не проиграл бы в производительности, поскольку на него твою программу можно перенести 1 в 1.
    Re[3]: Сильные стороны функционального программирования
    От: Павел Леонов Россия icq: 138726397
    Дата: 05.09.04 21:08
    Оценка:
    Здравствуйте, Quintanar, Вы писали :


    V>>1) Окружающий мир по своей природе императивен и непрерывно изменчив.

    V>>Электроны вертятся вокруг ядра, молекулы находятся в броуновском

    Q> Бездоказательные утверждения. В чем конкретно императивен мир? Разве

    Q> есть какое-то глобальное состояние мира, которое дискретно меняется
    Q> каждый такт времени?

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

    Q> Так что бытовому разуму может быть

    Q> императивный подход и ближе, но когда речь заходит о решении реально
    Q> сложных задач, функциональный подход оказывается предпочтительней.
    Q> Кроме того, я сомневаюсь в императивности человеческого мышления
    Q> вообще и уж точно оно не объектно-ориентированное. Лично я, когда
    Q> думаю как приготовить чай, ищу решение проблемы отталкиваясь от
    Q> предполагаемого результата. Т.е. нужен чай => нужна горячая вода и
    Q> сам чай => нужно согреть воду => нужно набрать воду и т.д. Это не
    Q> императивный подход.

    Допустим командир отряда с уже обученными десантннками обучает новичков, которые сидят на где-то на трибуне. Допустим он даже не отдает команд типа "стоять", "вперед"... а как-то руководит в функциональном стиле. Как будет обучатся новичок?

    Для начала он локализует область наблюдения, потом станет отмечать то что он видит.

    "Группа А переместилась из квадрата А в квадрат Б. Они стеляли. Со стороны открылась пальба, отряд залег."

    И уже потом (позже) он опишет свой опыт как

    "взятие высотки состоит в перемещении к ней со стрельбой и залегании при открытии ответного огня".

    Как-то так. Причем, если ученика кинут в атаку, до того как он сумел сформулировать окончательную свою мысль, то его программа по всему будет походить на императивную.

    PS. Я могу понять почему ФЯ торкнуло Гапертона, у него уже есть императивная база в виде 60 мегов. Если бы изначально был выбран только Хаскель, а условия предполагали меняющиеся требования к задаче, невозможность медлить с решением (более или менее качественным), то...
    Posted via RSDN NNTP Server 1.9 beta
    Re[3]: Сильные стороны функционального программирования
    От: INTP_mihoshi Россия  
    Дата: 06.09.04 05:17
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    Q>ФЯ много чего предлагают, в том числе и объекты как OCaml. В Haskell'е есть классы типов, например, и монады.


    Все так, вот только классы типов в Haskell к ООП отношения не имеют Класс типов — это просто набор функций, который должен бвть определен для всех типов, входящих в этот класс. Аналог интерфейса Java, вобщем.

    Кстати, в ОКамле аналогом классом типов являются модули.
    Re[4]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 06.09.04 07:49
    Оценка:
    Здравствуйте, INTP_mihoshi, Вы писали:

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


    Q>>ФЯ много чего предлагают, в том числе и объекты как OCaml. В Haskell'е есть классы типов, например, и монады.


    INT>Все так, вот только классы типов в Haskell к ООП отношения не имеют Класс типов — это просто набор функций, который должен бвть определен для всех типов, входящих в этот класс. Аналог интерфейса Java, вобщем.


    INT>Кстати, в ОКамле аналогом классом типов являются модули.


    А я и не говорил, что имеют. На интерфейсы они похожи, но реально есть определенные отличия.
    Re[19]: Сильные стороны функционального программирования
    От: Sergey Россия  
    Дата: 06.09.04 09:04
    Оценка:
    Hello, VladD2!
    You wrote on Sat, 04 Sep 2004 03:51:56 GMT:

    S>> Воистину так. Я тоже однажды решил сэкономить чуть-чуть на спичках

    S>> (лень было расчитывать, когда надо вид обновлять, а когда нет) и завяз
    S>> в отложенных вычислениях по самые уши, когда код слегка разросся.

    V> И естествнно даже не задумался, над тем что нужно было более тщательно

    V> все спроектировать...

    И без "ленивых" вычислений, естественно.

    V> Переписал все на ФЯ и все само сабой заработала. Причем быстрее белее и

    V> пушистее...

    Ленивые вычисления — да. Белее и пушистее.

    With best regards, Sergey.
    Posted via RSDN NNTP Server 1.9 beta
    Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
    Re[9]: Разница есть
    От: _Obelisk_ Россия http://www.ibm.com
    Дата: 06.09.04 11:08
    Оценка:
    G>Сомневаюсь, что на С++ получится проще.

    Конечные автоматы нет нужды писать на С/C++. Проще писать на чем-то более подходящем (например на SDL), а затем генерить C(или C++) код. Получается эффективней.

    Если очень хочется писать их реализацию ручками, то тоже можно. Это хорошо описано здесь :
    "Practical Statecharts in C/C++: Quantum Programming for Embedded"
    http://www.amazon.com/exec/obidos/tg/detail/-/1578201101/qid=1094468408/sr=1-1/ref=sr_1_1/002-6078401-9507225?v=glance&amp;s=books

    Причем можно писать не только обычные, плоские автоматы, но и иерархические, включая наследование и переопределение state-ов с transition-ами.



    Душа обязана трудиться! (с) Н.Заболоцкий.
    Re[2]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 06.09.04 11:30
    Оценка:
    Здравствуйте, prVovik, Вы писали:


    V>У меня появилось нестерпимое желание вставить свои пять копеек в этот очень интересный разговор, что я сейчас и сделаю


    V>Вот несколько мыслей о жизни, все ИМХО, и если я не прав, поправте меня.


    V>Начну из далека. Как всем хорошо известно, совпеменное ПО характеризуется высокой сложностью. Разрешить сложность таких систем можно с помощью декомпозиции их на мелкие и следовательно простые части. Эту самую декомпозицию можно проводить различными способами, причем задача декомпозиции сама по себе весьма нетривиальна. Исторически первым подходом к решению данной проблемы была структурная декомпозиция. Поначалу всё было хорошо, и все были довольны. Но время шло и ПО становилось все сложнее и сложнее. Выяснилось, что сделать эффективную декомпозицию сложной системы с помощью структурного подхода крайне трудно. Поэтому, был предложен объектно-ориентированный сбособ декомпозиции сложной системы, имеющий ряд весомых преимуществ по сравнению со стуктурным. На данный момент, ООД является доминирующим подходом, что будет дальше неизвестно. Напомню вкраце основные принципы ООП. Система состоит из объектов и каждый объект имеет изменяемое состояние. Он может посылать сообщения другим объектам и тем самым вызывать изменение их состояния.


    Все зависит от определения ООП, которым пользуешься. Так что я в свою очередь напомню принципы ООП. Это инкапсуляция, наследование, и полиморфизм. Боюсь, это определение более популярно (хотя на этом форуме благодаря стараниям Вовина многие уверены, что ООП — это смоллток). Изменяемое состояние объектов не является необходимостью, это исключительно свойство ИЯ.

    Все ФЯ позволяют делать инкапсуляцию.

    Полиморфизм в ФЯ такой, что ИЯ рядом не лежали. Мощнее на порядок. Если точнее, при определении полиморфной функции можно наложить почти произвольное условие на тип и значение. Мультиметоды? Да пожалуйста, функции полиморфны по произвольному числу аргументов.
    Напомню, что в "классическом" ООП при диспетчеризации вызова принимается во внимание только тип и только неявного аргумента.

    А что до наследования реализации, то это поддерживается явно в OCaml, и никаких принципиальных сложностей с реализацией этого в ФЯ нет. А в тех, где не поддерживается, подобное поведение достигается достаточно легко благодаря более развитому полиморфизму. Благодаря ему же, необходимость в применении наследования уменьшается (посмотрите STL в качестве иллюстрации, хоть С++ и не ФЯ, но дизайн похож).

    V> По всему видно, что использование ООД в чистых ФЯ затруднительно. А что же ФЯ предлагают в замен? А ничего. Приходится использовать старую структурную декомпозицию. Иногда этого хватает, например в случае с телекомом, но далеко не всегда.


    Во первых, это не так. В случае телекома применяется т. н. Concurrent Programming, где программа на высшем уровне декомпозиции состоит из большого (десятки тысяч и больше) количества взаимодействующих процессов. Декомпозиция является с одной стороны объектной (в терминах Алана Кея), т. к. процесс имеет инкапсулированное состояние, и взаимодействует с миром через посылку сообщений. С другой стороны — функциональной (в терминах Data Flow Diagram).

    А во вторых,нет необходимости предлагать что-то взамен, если можно предложить в дополнение.

    V> Читая эту ветку, у меня сложилось впечатление, что основной лейтмотив защитников ФЯ таков: "ввиду наличия состояний программы написанной на императивном языке, её труднее отлаживать и сопровождать, поэтому надо перейти к ФЯ, лишенных этих недостатков". Можно провести аналогию с таким утверждением: "Автомобили загрязняют атмосферу, поэтому надо перейти на велосипеды". Эти утверждения выглядят вполне логично, но есть одно "НО". Можно ли применять велосипеды в той же мере, в какой применяются автомобили? Очевидно, что не всегда. Но можно говорить о рамках применимости. Это же касается и ФЯ. Так, например, я считаю, что ФЯ плохо подходят для разработки мощного текстового редактора, типа ворда (я не имею ввиду "экстремальный спорт", понятно что "раком" можно и до Китая доскакать).


    В этой ветке кое-кто уперся рогом на тему, что неопределенный порядок вычислений якобы не представляет опасности в ИЯ (т. е. при наличии побочных эффектов). Не советую составлять впечатление о преимуществах ФЯ из прений сторон на эту тему.

    Это один из плюсов. Но далеко не единственный — ФЯ характеризуются не только теми вещами, которых в них нет (состояний). Основной плюс на самом деле — в декларативном описании алгоритмов и данных. Сравните программирование на Transact SQL и разработку под dBase-подобные базы — будет похоже.

    V>И еще пара замечаний.


    V>1) Окружающий мир по своей природе императивен и непрерывно изменчив. Электроны вертятся вокруг ядра, молекулы находятся в броуновском движении, Земля вращается вокруг Солнца, люди рождаются и умирают и т.д. В этом смысле ФЯ не имеют ничего общего с реальным миром, они являются исключительно плодом человеческого воображения. Поэтому, ФЯ мало подходят для моделирования предметной области, связанной с окружающим миром, например для бухгалтерских систем.


    При этом в бизнес-анализе и моделировании часто применяются функциональные модели — IDEF0 и DFD. Парадокс.

    V>2) Человек мыслит императивно. Если у Вас спросить, как приготовить чай, что вы ответите? Вы опишете последовательность действий: налить в чайник воду, вскипятить и пр. Врядли кто-то опишет набор функций,каскадный вызов которых приведет к появлению чая. То есть ИЯ ближе к человеческому мышлению, и, следовательно,более доступны ему.


    Все аналогии ущербны. Но раз уж ты начал...

    Чтобы сделать чай, мне нужен кипяток и заварка.
    Чтобы сделать кипяток, мне нужно электричество, и чайник с водой.
    Чтобы получить чайник с водой, мне нужен пустой чайник и водопроводная вода.

    Это я помню. И могу без проблем сделать себе чай. А алгоритм для себя составлять каждый раз как-то ломает. Это пусть делают те, кто мыслят только императивно
    Re[10]: Разница есть
    От: Gaperton http://gaperton.livejournal.com
    Дата: 06.09.04 11:41
    Оценка:
    Здравствуйте, _Obelisk_, Вы писали:

    _O_>Конечные автоматы нет нужды писать на С/C++. Проще писать на чем-то более подходящем (например на SDL), а затем генерить C(или C++) код. Получается эффективней.

    Знаю. Только известные мне SDL тулзы очень дорогие (кинь ссылки, если знаешь халяву, плз). Но в любом случае, иногда приходится делать КА и руками.

    _O_>Если очень хочется писать их реализацию ручками, то тоже можно. Это хорошо описано здесь :

    _O_>"Practical Statecharts in C/C++: Quantum Programming for Embedded"
    _O_>http://www.amazon.com/exec/obidos/tg/detail/-/1578201101/qid=1094468408/sr=1-1/ref=sr_1_1/002-6078401-9507225?v=glance&amp;s=books
    Да вроде я и так это умею. Но за ссылку все равно спасибо, не знал, что на такие темы книги пишут.
    Re: Сильные стороны функционального программирования
    От: little_alex  
    Дата: 06.09.04 12:46
    Оценка:
    Здравствуйте.
    Есть два вопроса к гуру ФЯ.
    1.Есть ли док-во того что на современных машинах программа на ФЯ будет выполняться с такой-же скоростью как и на императивном.Сравниваем языки а не компиляторы .Поэтому предполагаем отсутствие оптимизации и забиваем на константный множитель (сравниваем log(N) < N; 10N == N ).
    2.Отсутствие циклических структур данных или их эмуляция — это тоже достоинство?
    С деревом на ФЯ работать одно удовольствие.А вот с графом...Есть конечно fgl.Но это эмуляция графа деревом.Ну нет той чистой простоты
    По-видимому если две ссылки от двух вершин указывают на третью то они должны указавать на одну и ту же вершину.Это противоречит великому принципу ФЯ?

    У меня складывается впечатление что легко и быстро можно работать только с односвязными списками и деревьями всех мастей — здесь все для вас и конструкторы и pattern matching .. А вот уже массивы не вкладываютя в общую
    систему и необходима специальная поддержка компилятора чтобы доступ не стал O(n) И двусвязные списки тудаже.
    .string1++string2 за время O(length(string2)) — work around в виде списка функций

    Фундаментальной структурой данных ИЯ является массив — ФЯ дерево?
    Re[2]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 06.09.04 13:34
    Оценка:
    Здравствуйте, little_alex, Вы писали:

    _>Здравствуйте.

    _>Есть два вопроса к гуру ФЯ.
    _>1.Есть ли док-во того что на современных машинах программа на ФЯ будет выполняться с такой-же скоростью как и на императивном.Сравниваем языки а не компиляторы .Поэтому предполагаем отсутствие оптимизации и забиваем на константный множитель (сравниваем log(N) < N; 10N == N ).

    Вопрос не очень понятен. Java и C++ оба императивные, но выполняются с существенно разной скоростью. Или если уж исключить интерпретаторы, то C и C++ отличаются по скорости. Да и не столь она важна в наши дни. PHP, Perl, Pyton процветают, хотя по скоростным качествам С лучше.


    _>2.Отсутствие циклических структур данных или их эмуляция — это тоже достоинство?

    _>С деревом на ФЯ работать одно удовольствие.А вот с графом...Есть конечно fgl.Но это эмуляция графа деревом.Ну нет той чистой простоты
    _>По-видимому если две ссылки от двух вершин указывают на третью то они должны указавать на одну и ту же вершину.Это противоречит великому принципу ФЯ?

    Графы фактически являются массивами. Представление их в виде отдельных объектов -ребер со ссылками на соседей не очень удобно на мой взгляд.
    Re[3]: Сильные стороны функционального программирования
    От: little_alex  
    Дата: 06.09.04 14:10
    Оценка: +1
    Здравствуйте, Quintanar, Вы писали:

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


    _>>Здравствуйте.

    _>>Есть два вопроса к гуру ФЯ.
    _>>1.Есть ли док-во того что на современных машинах программа на ФЯ будет выполняться с такой-же скоростью как и на императивном.Сравниваем языки а не компиляторы .Поэтому предполагаем отсутствие оптимизации и забиваем на константный множитель (сравниваем log(N) < N; 10N == N ).

    Q>Вопрос не очень понятен. Java и C++ оба императивные, но выполняются с существенно разной скоростью. Или если уж исключить интерпретаторы, то C и C++ отличаются по скорости. Да и не столь она важна в наши дни. PHP, Perl, Pyton процветают, хотя по скоростным качествам С лучше.


    Для каждого алгорима есть асимпотическое(по количеству входных данных) время.Некоторые алгоритмы на ФЯ не перепишешь.Ну так вот аналогичный на ФП будет такой же скорости
    Re[2]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 06.09.04 14:32
    Оценка: 20 (5)
    Здравствуйте, little_alex, Вы писали:

    _>Здравствуйте.

    _>Есть два вопроса к гуру ФЯ.
    _>1.Есть ли док-во того что на современных машинах программа на ФЯ будет выполняться с такой-же скоростью как и на императивном.Сравниваем языки а не компиляторы .Поэтому предполагаем отсутствие оптимизации и забиваем на константный множитель (сравниваем log(N) < N; 10N == N ).
    Не знаю, возможно-ли дать такое доказательство и существует ли оно. Думаю, для подавляющего большинства задач это верно. Во всяком случае, контрпримера пока не видал. Приведете?

    _>2.Отсутствие циклических структур данных или их эмуляция — это тоже достоинство?

    Ну наконец кто-то начал говорить о настоящих проблемах ФЯ. Ок, побеседуем. Представляю, какие радостные крики сейчас начнутся.
    _>С деревом на ФЯ работать одно удовольствие.
    Сформулируем более общо. С типами, алгоритмами, и данными которые допускают рекурсивные определения работать одно удовольствие.
    _>А вот с графом...Есть конечно fgl.Но это эмуляция графа деревом.Ну нет той чистой простоты
    _>По-видимому если две ссылки от двух вершин указывают на третью то они должны указавать на одну и ту же вершину.Это противоречит великому принципу ФЯ?
    Нет конечно. Зачем, кстати, язвить? Вершины могут и будут разделяться, так что с ациклическими графами проблем нет. Настоящие циклические ссылки тоже возможны — но подграф с циклом должен быть создан сразу, модификацией такого не достичь. Есть соответствующие примеры на Хаскеле.

    Т. е. настоящая проблема (вернее, принципиальное ограничение) формулируется так. Невозможно менять состояние элементов функциональной циклической структуры по отдельности, она может быть изменена только целиком. Что не очень эффективно. И никакие трюки вроде монад и uniqueness typing здесь не помогут. Однако надо понимать, что
    1) Это является принципиальной проблемой только "чистых" ФЯ, которые не допускают побочных эффектов. А это только Clean и Haskell.
    2) При этом, это совершенно не смертельно. Для графа существует несколько вариантов эффективных по памяти и скорости представлений, не содержащих прямых циклических ссылок. В ФЯ мы будет переходить от одного представления к другому, в зависимости от того, какие операции доминируют в данный момент, чтения или модификации. Т. е. мы будем применять т. н. functional update. См. ниже, на примере массивов.
    3) Используя ФЯ с императивными расширениями, вроде OCaml, мы всегда можем перейти к императивному стилю, если не хватит скорости. В OCaml весьма гладкая сшивка императивных и функциональных возможностей.

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

    _>систему и необходима специальная поддержка компилятора чтобы доступ не стал O(n).
    Неправда. Укладываются великолепно в сочетании с list и array comprehensions. Доступ к массивам всегда O(1). А на поэлементной модификации можно словить и O(N), если захотеть. А если не хочется, то:
    1) Если модифицируется весь или большая часть массива, то он обычно пересоздается целиком один раз с уже измененными элементами (используя list или array comprehensions), и никакого N^2 там не будет. Без всякой поддержки компилятора — это так называемый functional array update, возможный в любом ФЯ. Записывается кратко и удобно. По вычислительной сложности не проигрывает обычному деструктивному изменению. Пример на Хаскелездесь
    Автор: Gaperton
    Дата: 15.06.04
    .

    2) Чтобы получить деструктивное O(1) изменение массива в Хаскель, достаточно воспользоваться монадой ST. В Clean — достаточно указать, что массив уникален (воспользоваться uniqueness typing). А остальные распространенные языки разрешают побочные эффекты. Так что массивы можно модифицировать по одному элементу быстро и без напрягов делая прямое деструктивное изменение. Единственный из популярных ФЯ где так делать нельзя — Erlang.

    Итого, настоящая проблема: В Erlang поэлементное изменение массива имеет сложность O(N).

    _> И двусвязные списки тудаже.

    С этим та же ситуация, что и с графами, т. е. такой список может быть изменен только будучи целиком созданным заново. Но меньше способов выкрутится. Тем не менее, они есть.
    1) Первый (для чистых ФЯ) состоит в разворачивании однонаправленного списка по мере необходимости. Скажете, это не эффективно? Да, конечно. Но и не смертельно, мы ведь говорим о вычислительной сложности, так? Рассмотрим пример — надо реализовать очередь. Делаем ее на паре двунаправленных списков. Кладем поступающие элементы в первый список. Забираем элементы из второго списка. Если он пуст (!) присваиваем ему результат разворота первого списка, первый список делаем пустым. Эта структура известна как Okasaki Queue, и имеет средневзвешенную сложность операций put и get равную O(1).

    2) Второй (для чистых ФЯ) — использовать read-only двунаправленные списки, пересоздавать их используя групповые изменения, как с массивами.

    3) Третий — пользуемся императивными расширениями, если не хватило производительности.

    _>.string1++string2 за время O(length(string2)) — work around в виде списка функций

    Проблема многих ФЯ в том, что строки там представлены списками. Вот где ужас-то, на самом деле. Строки там медленные. Ну, кроме тех ФЯ, где строки представлены массивами . Например Clean.

    _>Фундаментальной структурой данных ИЯ является массив — ФЯ дерево?

    Для ФЯ — скорее список.
    Re[2]: Сильные стороны функционального программирования
    От: ON  
    Дата: 06.09.04 14:38
    Оценка: 4 (1)
    From: little_alex

    я не гуру, но отвечу, гуру поправят.

    >1.Есть ли док-во того что на современных машинах программа на ФЯ будет выполняться с такой-же скоростью как и на императивном.Сравниваем языки а не компиляторы .Поэтому предполагаем отсутствие оптимизации и забиваем на константный множитель (сравниваем log(N) < N; 10N == N ).


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

    >2.Отсутствие циклических структур данных или их эмуляция — это тоже достоинство?

    С деревом на ФЯ работать одно удовольствие.А вот с графом...Есть конечно fgl.Но это эмуляция графа деревом.Ну нет той чистой простоты

    Граф можно представить деревом и соответствующие многоуровневые шаблоны тоже можно разложить в одноуровневые, читай про суперкомбинаторы. ФЯ-программистам и в голову не придет писать процедуры на несколько страниц. Дерево, конечно, получится на уровень выше, а в листьях будут повторы, но они вычисляются только один раз, или вообще не вычисляются . У ФЯ оптимизация отчасти происходит в run-time, поэтому предсказать скорость трудно. Важнее то, что ФЯ требует больше памяти, если начнется своп, вот это будет заметно.

    >По-видимому если две ссылки от двух вершин указывают на третью то они должны указавать на одну и ту же вершину.Это противоречит великому принципу ФЯ?


    Какому принципу? У графа ведь нет корня, ты его описываешь со всех сторон как тебе удобнее. Пиши так, чтобы та вершина была вершиной дерева, а не листом.

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

    систему и необходима специальная поддержка компилятора чтобы доступ не стал O(n) И двусвязные списки тудаже.
    .string1++string2 за время O(length(string2)) — work around в виде списка функций

    Имхо, выражение в С++ вроде "a[5]" это декларативный стиль. Мы говорим пятый элемент. Элемент, который пятый. Так что это должно оптимизироваться и в родном для такого стиля ФЯ. Думаю с массивами сложностей не должно быть, а вот со сложными структурами ФЯ действильно удобнее. И вообще, массивы в ФЯ не обрабатываются, там вообще ничего не обрабатывается, там все описывается. Выполнение программы мне представляется таким наслоение новых слоев данных, то, что нужно остается, а лишний мусор убирается. Новое состояние массива строится поверх старого, а старый убирается когда станет ненужен. На прежнем месте присваивания происходят при выполнении если компилятор определил что можно так с-оптимизировать.

    >Фундаментальной структурой данных ИЯ является массив — ФЯ дерево?


    Неа, фундаментальной структурой данных является функция
    Тут не надо думать что программы это алгоритмы и структуры данных. В осмысленные единицы системы там инкапсулируются не алгоритмы со структурами и потом туда бинарно заливаются данные и запускаются методы. ФЯ программа это не мясорубка в которую входят аргументы и из них делается результат. ФЯ строит результат из своего сырья, но "на тему" аргументов.
    Posted via RSDN NNTP Server 1.9 beta
    Re[17]: Сильные стороны функционального программирования
    От: hrg Россия  
    Дата: 06.09.04 14:42
    Оценка:
    Lloyd -> "Re[16]: Сильные стороны функционального программирования" :

    L> журнала и насколько я помню, это у тебя в профайле по крайней пере

    L> пару лет уже записано. Судя по пикче, которая у тебя в профайле же,
    L> тебе не очень много лет. Думаю вряд ли взрослый серьезный человек

    Чувааааак. Это же DOOM! Возможно даже 1-й. А это как минимум 8 лет назад

    Yury Kopyl aka hrg | http://id.totem.ru | Все вышесказанное является моим
    личным мнением и может быть использовано против вас
    Posted via RSDN NNTP Server 1.9 beta
    Re[2]: Сильные стороны функционального программирования
    От: Silver_s Ниоткуда  
    Дата: 06.09.04 15:06
    Оценка:
    Здравствуйте, little_alex, Вы писали:

    _>1.Есть ли док-во того что на современных машинах программа на ФЯ будет выполняться с такой-же скоростью как и на императивном.Сравниваем языки а не компиляторы .Поэтому предполагаем отсутствие оптимизации и забиваем на константный множитель (сравниваем log(N) < N; 10N == N ).


    А это не совсем правильно сравнивать скорость языков а не компиляторов... языки не обладают ни скоростью ни производительностью, такими свойствами обладают компиляторы и оптимизаторы. Цель языка описать задачу. И потенциально компиляторы более декларативных языков более производительны, так как языки им оставляют больше свободы для оптимизации.
    Re[3]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 06.09.04 15:18
    Оценка:
    Здравствуйте, Silver_s, Вы писали:

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


    _>>1.Есть ли док-во того что на современных машинах программа на ФЯ будет выполняться с такой-же скоростью как и на императивном.Сравниваем языки а не компиляторы .Поэтому предполагаем отсутствие оптимизации и забиваем на константный множитель (сравниваем log(N) < N; 10N == N ).


    S_>А это не совсем правильно сравнивать скорость языков а не компиляторов... языки не обладают ни скоростью ни производительностью, такими свойствами обладают компиляторы и оптимизаторы. Цель языка описать задачу. И потенциально компиляторы более декларативных языков более производительны, так как языки им оставляют больше свободы для оптимизации.

    Вообще — правильно человек вопрос ставит . Он говорит о вычислительной сложности.

    При этом, так как монада ST и uniqueness typing гарантируют то, что на объект будет единственная ссылка, то возможно деструктивное изменение с сохранением функциональной семантики. Эти вещи являются частью языка, и программист рассчитывает на деструктивное изменение применяя такие вещи. Я предполагаю, что little_alex со мной согласен.

    "Оптимизацией" являются такие вещи, например, как single threadness analyzis, который программистом явно не контроллируется, частью языка не является, и способен в ряде случаев радикально улучшить производительность функциональной программы. Считаем это жульничеством, божественным вмешательством, и оптимизацией.
    Re[3]: Сильные стороны функционального программирования
    От: little_alex  
    Дата: 06.09.04 15:25
    Оценка:
    Здравствуйте, Gaperton, Вы писали:


    _>>2.Отсутствие циклических структур данных или их эмуляция — это тоже достоинство?

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

    _>>А вот с графом...Есть конечно fgl.Но это эмуляция графа деревом.Ну нет той чистой простоты

    _>>По-видимому если две ссылки от двух вершин указывают на третью то они должны указавать на одну и ту же вершину.Это противоречит великому принципу ФЯ?
    G>Нет конечно. Зачем, кстати, язвить? Вершины могут и будут разделяться, так что с ациклическими графами проблем нет. Настоящие циклические ссылки тоже возможны — но подграф с циклом должен быть создан сразу, модификацией такого не достичь. Есть соответствующие примеры на Хаскеле.

    Да и насколько я понимаю это возможно только при помощи lazy evaluation
    примерно так
    List = Null | List Int List List -- List содержимое преведущий следующий
    let A1= List 10 Null A2
    A2= List 20 A1 A3
    A3= List 30 A2 Null
    in A1

    G>Т. е. настоящая проблема (вернее, принципиальное ограничение) формулируется так. Невозможно менять состояние элементов функциональной циклической структуры по отдельности, она может быть изменена только целиком. Что не очень эффективно.

    В этом и был вопрос.Хоть я и не очень понятно объяснил

    G>1) Это является принципиальной проблемой только "чистых" ФЯ, которые не допускают побочных эффектов. А это только Clean и Haskell.

    Haskell

    G>2) При этом, это совершенно не смертельно. Для графа существует несколько вариантов эффективных по памяти и скорости представлений, не содержащих прямых циклических ссылок. В ФЯ мы будет переходить от одного представления к другому, в зависимости от того, какие операции доминируют в данный момент, чтения или модификации. Т. е. мы будем применять т. н. functional update. См. ниже, на примере массивов.


    Ну да есть массив-индексы в массиве — те же ссылки -а двум числам никто не запретит быть одинаковыми
    Неприятность — неизвестен заранее размер массива .Да GC в массиве придется делать самому

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

    _>>систему и необходима специальная поддержка компилятора чтобы доступ не стал O(n).
    G>Неправда. Укладываются великолепно в сочетании с list и array comprehensions. Доступ к массивам всегда O(1). А на поэлементной модификации можно словить и O(N), если захотеть. А если не хочется, то:
    G>1) Если модифицируется весь или большая часть массива, то он обычно пересоздается целиком один раз с уже измененными элементами (используя list или array comprehensions), и никакого N^2 там не будет. Без всякой поддержки компилятора — это так называемый functional array update, возможный в любом ФЯ. Записывается кратко и удобно. По вычислительной сложности не проигрывает обычному деструктивному изменению. Пример на Хаскелездесь
    Автор: Gaperton
    Дата: 15.06.04
    .

    Вы меня не поняли — массив не объявишь и не реализуешь стандартными средствами того же Haskell а встроен как Int.А не как data List a = Null | a:List a.


    G>2) Чтобы получить деструктивное O(1) изменение массива в Хаскель, достаточно воспользоваться монадой ST.

    Thanks.Не знал.

    _>> И двусвязные списки тудаже.

    G>С этим та же ситуация, что и с графами, т. е. такой список может быть изменен только будучи целиком созданным заново. Но меньше способов выкрутится. Тем не менее, они есть.
    G>1) Первый (для чистых ФЯ) состоит в разворачивании однонаправленного списка по мере необходимости. Скажете, это не эффективно? Да, конечно. Но и не смертельно, мы ведь говорим о вычислительной сложности, так? Рассмотрим пример — надо реализовать очередь. Делаем ее на паре двунаправленных списков. Кладем поступающие элементы в первый список. Забираем элементы из второго списка. Если он пуст (!) присваиваем ему результат разворота первого списка, первый список делаем пустым. Эта структура известна как Okasaki Queue, и имеет средневзвешенную сложность операций put и get равную O(1).
    Читал.

    G>2) Второй (для чистых ФЯ) — использовать read-only двунаправленные списки, пересоздавать их используя групповые изменения, как с массивами.




    _>>Фундаментальной структурой данных ИЯ является массив — ФЯ дерево?

    G>Для ФЯ — скорее список.
    Maybe
    Re[4]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 06.09.04 16:21
    Оценка:
    Здравствуйте, little_alex, Вы писали:

    _>Ну да есть массив-индексы в массиве — те же ссылки -а двум числам никто не запретит быть одинаковыми

    _>Неприятность — неизвестен заранее размер массива .Да GC в массиве придется делать самому
    Графы из стандартной либы не подходят? http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data.Graph.html
    Re[23]: Сильные стороны функционального программирования
    От: WolfHound  
    Дата: 06.09.04 17:10
    Оценка: 16 (1)
    Здравствуйте, Quintanar, Вы писали:

    Q>На интерпретаторе (!) ghci под Windows на моей не самой быстрой машине первые 5000 (до 48619) чисел вычислились за 40 секунд, что примерно в 2 раза быстрее, чем на твоей программе .

    Ну если тебе надо 5000 то...
    number = 2 x = 1 count = 1 time = 6.56336e-06
    number = 3 x = 2 count = 2 time = 0.00123109
    number = 5 x = 3 count = 3 time = 0.00220563
    number = 7 x = 5 count = 4 time = 0.00318859
    number = 11 x = 8 count = 5 time = 0.00425005
    number = 17 x = 13 count = 7 time = 0.00521524
    number = 23 x = 21 count = 9 time = 0.0062029
    number = 37 x = 34 count = 12 time = 0.00726603
    number = 59 x = 55 count = 17 time = 0.00827418
    number = 97 x = 89 count = 25 time = 0.00942301
    number = 149 x = 144 count = 35 time = 0.0104404
    number = 239 x = 233 count = 52 time = 0.0114785
    number = 379 x = 377 count = 75 time = 0.0132433
    number = 613 x = 610 count = 112 time = 0.0142888
    number = 991 x = 987 count = 167 time = 0.0155076
    number = 1601 x = 1597 count = 252 time = 0.0165676
    number = 2591 x = 2584 count = 377 time = 0.0177834
    number = 4201 x = 4181 count = 575 time = 0.0188863
    number = 6779 x = 6765 count = 872 time = 0.0201199
    number = 10949 x = 10946 count = 1330 time = 0.021233
    number = 17713 x = 17711 count = 2034 time = 0.0225363
    number = 28661 x = 28657 count = 3122 time = 0.0237418
    number = 46381 x = 46368 count = 4795 time = 0.0249562
    total = 5136 time = 0.0262307

    Подавляющие время занял вывод.
    Q>Знаю, знаю. Твоя программа сразу знала верхний предел и поэтому вычеркивала числа сразу до него . Но что же делать, я то имел ввиду ленивые вычисления, и моя программа могла бы быть написана более эффективно, если бы был задан верхний предел. Т.е. задачи решаются разные. Для сравнения нужна программа, которая заранее не знает сколько от нее потребуют простых чисел.
    легко
    //Это ограничительная константа(твоя программа раньше сдохнет.)
    //На 64х битных платформах ее можно со спкойной совестью еще поднять.
    //Но у меня 32х битная машина :(
    size_t const max_number=2*1024*1024*1000;
    //Этой константой можно играться для тонкой настройки производительности алгоритма
    size_t const buf_count=4*1024*1024;
    size_t const buf_size=buf_count/CHAR_BIT;
    
    struct prime_numbers
    {
        size_t cur_number;
        size_t state;
        size_t offset;
        size_t next_offset;
        std::vector<byte> buf;
        std::vector<size_t> numbers;
    
        prime_numbers()
            :state(8)
            ,offset(0)
            ,next_offset(buf_count)
            ,buf(buf_size+100)
        {
            numbers.reserve(2*1024*1024);
        }
        void set_bit(size_t n)
        {
            n-=offset;
            size_t pos=n/CHAR_BIT;
            size_t ofs=n%CHAR_BIT;
            buf[pos]|=1<<ofs;
        }
        bool get_bit(size_t n)
        {
            if(n>=next_offset)
            {
                offset=next_offset;
                next_offset+=buf_count;
                std::fill(buf.begin(), buf.end(), 0);
                //вычеркивать начинаем с 7 ибо числа кратные 2, 3, 5 нам всеравно не попадутся :))
                for(size_t i=3, c=numbers.size();i<c;++i)
                    remove_number(numbers[i]);
            }
            n-=offset;
            size_t pos=n/CHAR_BIT;
            size_t ofs=n%CHAR_BIT;
            return buf[pos]&(1<<ofs);
        }
        void new_number(size_t i)
        {
            numbers.push_back(i);
            remove_number(i);
        }
        void remove_number(size_t i)
        {
            for(size_t n=(offset/i+1)*i;n<next_offset;n+=i)
                set_bit(n);
        }
        size_t get_next()
        {
            size_t i=cur_number;
            switch(state)
            {
                case  8:    new_number(2);    state= 9;    return 2;
                case  9:    new_number(3);    state=10;    return 3;
                case 10:    new_number(5);    state=11;    return 5;
                case 11:    i=1;
                case 0:
                for(;i<max_number;)
                {
                        i+=6;    if(!get_bit(i))    {new_number(i);    state=1;    return cur_number=i;}
                case 1:    i+=4;    if(!get_bit(i))    {new_number(i);    state=2;    return cur_number=i;}
                case 2:    i+=2;    if(!get_bit(i))    {new_number(i);    state=3;    return cur_number=i;}
                case 3:    i+=4;    if(!get_bit(i))    {new_number(i);    state=4;    return cur_number=i;}
                case 4:    i+=2;    if(!get_bit(i))    {new_number(i);    state=5;    return cur_number=i;}
                case 5:    i+=4;    if(!get_bit(i))    {new_number(i);    state=6;    return cur_number=i;}
                case 6:    i+=6;    if(!get_bit(i))    {new_number(i);    state=7;    return cur_number=i;}
                case 7:    i+=2;    if(!get_bit(i))    {new_number(i);    state=0;    return cur_number=i;}
                }
                state=12;
                case 12:;
            }
            return -1;
        }
    };
    #include "1.h"
    int main()
    {
        prime_numbers numbers;
        timer.reset();
        for(;;)
        {
            size_t n=numbers.get_next();
            if(n==-1)
                break;
            on_prime_number_print(n);
        }
        std::cout<<"total = "<<count<<" time = "<<timer.time()<<std::endl;
        return 0;
    }

    эта падла еще и работать быстрее стала.
    Хотя на придельной дистанции получилось медленнее надо будет попробевать ее пооптимизировать
    number = 2 x = 1 count = 1 time = 0.011247
    number = 3 x = 2 count = 2 time = 0.0224944
    number = 5 x = 4 count = 3 time = 0.0287227
    number = 11 x = 8 count = 5 time = 0.0357256
    number = 17 x = 16 count = 7 time = 0.0404335
    number = 37 x = 32 count = 12 time = 0.0475099
    number = 67 x = 64 count = 19 time = 0.0526
    number = 131 x = 128 count = 32 time = 0.059383
    number = 257 x = 256 count = 55 time = 0.0659315
    number = 521 x = 512 count = 98 time = 0.0716429
    number = 1031 x = 1024 count = 173 time = 0.0795682
    number = 2053 x = 2048 count = 310 time = 0.0849316
    number = 4099 x = 4096 count = 565 time = 0.0922635
    number = 8209 x = 8192 count = 1029 time = 0.0975916
    number = 16411 x = 16384 count = 1901 time = 0.103196
    number = 32771 x = 32768 count = 3513 time = 0.113651
    number = 65537 x = 65536 count = 6543 time = 0.124821
    number = 131101 x = 131072 count = 12252 time = 0.133369
    number = 262147 x = 262144 count = 23001 time = 0.140619
    number = 524309 x = 524288 count = 43391 time = 0.146233
    number = 1048583 x = 1048576 count = 82026 time = 0.153858
    number = 2097169 x = 2097152 count = 155612 time = 0.164312
    number = 4194319 x = 4194304 count = 295948 time = 0.258359
    number = 8388617 x = 8388608 count = 564164 time = 0.376738
    number = 16777259 x = 16777216 count = 1077872 time = 0.637997
    number = 33554467 x = 33554432 count = 2063690 time = 1.21231
    number = 67108879 x = 67108864 count = 3957810 time = 2.65548
    number = 134217757 x = 134217728 count = 7603554 time = 6.5156
    number = 268435459 x = 268435456 count = 14630844 time = 17.9281
    number = 536870923 x = 536870912 count = 28192751 time = 54.6199
    number = 1073741827 x = 1073741824 count = 54400029 time = 180.671
    total = 102754101 time = 608.485


    Q>Кстати, OCaml, думаю, вообще не проиграл бы в производительности, поскольку на него твою программу можно перенести 1 в 1.

    Если писать императивно. Кстати напиши. И сравним производительность
    ... << RSDN@Home 1.1.4 rev. 142 >>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[4]: Сильные стороны функционального программирования
    От: Silver_s Ниоткуда  
    Дата: 06.09.04 19:05
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>"Оптимизацией" являются такие вещи, например, как single threadness analyzis, который программистом явно не контроллируется, частью языка не является, и способен в ряде случаев радикально улучшить производительность функциональной программы. Считаем это жульничеством, божественным вмешательством, и оптимизацией.


    Ну смотря что считать оптимизацией. По большому счету то оптимизация это подмена одной программы (или куска) на любую другую с точно такими же побочными эффектами.
    Если, скажем, мы написали алгоритм пузырьковой сортировки, то компилятор имеет полное право считать это декларативным описанием задачи, и подменить решение этой задачи на быструю сортировку каким нибудь делением пополам. Естейственно только если он обнаружит что побочные эффекты одинаковые. Если же кто-то наблюдает за этой пузырьковой сортировкой на экране (может для этого эту программу и писали), то компилятор естейственно скажет "...Кто здесь?...побочные эффекты кто-то использует, значит оптимизировать нельзя."

    А пузырьковая сортировка более декларативна чем быстрая. Декларативность это пожалуй минимум избыточности в логике при описании задачи.
    Хотя в идеале декларативное описание сортировки должно выглядеть так:


    Sort(Array A)
    {
      for(x in A.IndexSet and y in A.IndexSet)
       if(x>y) 
         Assert(A[x]>A[y])
    }


    И все, для декларативного описания сортировки больше ничего не надо. Это конечно не язык какой то — это отсебятина. Но думаю сложно не догадаться что этот код подразумевает сортировку, и какая семантика должна быть у языка. А от компилятора требуется подменить этот код на любой другой, только чтобы не проваливать Assert'ы в оригинальном коде. Вот это истинная декларативность. Где скачать такой такой компилятор, который смог бы соптимизировать подобный код до алгоритма быстрой сортировки, я скромно умолчу
    Но дело то не в том где его взять, а в том что программисты пишущие алгоритмы сортировки которые не создают побочных эффектов кроме как описаных этим кодом, они впустую тратят время, т.е. паралально решают ненужные задачи из за несовершенства компилятора, засоряют код мусором.
    А вот если нужно на экране демонстрировать процесс пузырьковой сортировки, то пришлось бы его все равно писать. Потому что побочные эффекты, понимаишь, создаваться будут. Хотя они не столько побочные сколько суть программы, ради чего ее делали. Программы создают только ради побочных эффектов.
    Это все не столько к ФЯ сколько вобще к декларативным языкам относится. Но у ФЯ много признаков декларативности.
    Re[5]: Сильные стороны функционального программирования
    От: Silver_s Ниоткуда  
    Дата: 06.09.04 19:41
    Оценка:
    А вобще это все к вопросу о скорости выполнения, вычислительной сложности итд.

    Какой вариант должен работать быстрее, конкретный алгоритм сортировки на C# или такой декларативный алгоритм:

    declarative void Sort(int[] A)
    {
      for(int i=0;i<A.Length;i++)
       for(int j=0;j<A.Length;j++)
        if(i<j)
         assert(A[i]<A[j]);
    }


    Естейственно декларативная форма должна работать быстрее.
    Кстати, не путать ее с функцией на C# проверки отсортированности массива, это именно функция сортировки массива, у нее другая семантика из-за ключевого слова declarative хоть она и выглядит похоже.
    Re[2]: Кстати, Фортран
    От: achp  
    Дата: 06.09.04 21:20
    Оценка:
    Здравствуйте, Nick_, Вы писали:

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


    В Си есть на этот случай ключевое слово restrict.

    N_>Зачислять фортран в функциональные языки наверное не стоит, но по уровню абстракции он немного выше языка Си.


    Си — возможно. Но не Си++.
    Re[11]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:56
    Оценка: +1 -4 :)
    Здравствуйте, Gaperton, Вы писали:

    G>У меня предложение попроще, способное на порядок поднять культуру общения. Давайте Чистякоа перестанет хамить и переходить на личности.


    То что ты называешь хамством другие называют называть вещи своими именами. Или говорить правду. Что же до хамства, то не тебе об этом говорить. Кажется не я поднял вопрос о быдляцких манерах (или что там было быдляцкого?).

    G>Объясни это Чистякову. Я ему недавно объяснял подробно, он видимо не понимает.


    Ты в зеркало чаще смотри. Там иногда можно такое хамство заметить... Твои утверждения порой довольно сильно раздражают. И уж политкорретными твои слова точно не всегда можно назвать. А главное, что столько тебе не говришь, что разводимый тобой флэйм только вредит продвижению ФЯ в массы ты этого не понимашь. Тут рядом я уже все сказал. Прочти. И попробуф отбросить предвятоать. Поверь о популяризации я знаю точно болше тебя. И готов помогать. Но помогать качественной работе. А не пропаганеде. Не нужно громких заявлений. Не нужно противопоставлений. Нужны голые факты, демонстрация красоты и изящества и т.п.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[15]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:56
    Оценка: -1
    Здравствуйте, Gaperton, Вы писали:

    VD>>Значит не понял. Ну, тут ничего не поделашь.

    G>А ты еще чего нибудь скажи, зачем так сразу сдаваться.

    Сказал "чего-нибудь".

    G> Про демагогию, например, что-то давно слушно не было.


    А ты разведи и я скажу. Поговори о умственных способностях собеседника. Унизь его прау раз. И я обязательно скажу.

    G> Усомнись в моей профпригодности, в способности понимать русский язык.


    Русский? Не знаю... А вот то, что понимать чужую точку зрения ты не умешь это точно. Что до умственных способностей, то унижать других это ты больше любиш. Я вижу только, что ты постоянно высказыаешья о том, же дотнете нифига его не зная. Но это как бы не умственные спомсобности вроде.

    G> Побей себя копытом в грудь — скажи, что у тебя на дефект уходит 5 — нет, 3 минуты.


    А что мне бить то? У кого копыта тот и должен себя (других?) бить.
    А про то насколько быстро находятся и устраняются ошибки в Шарпе ты можешь задать вопрос в соотвествующем форуме. Моих скилов в нете тебе явно не достаточно. Пусть тебе другие скажут. А еще лучше изучи дотнет и пол годика по программируй на том же Шарпе. Тогда вопрос будет исчерпан сам собой. Забавно будет послушать тебя после этого... как ты расскажешь, что нужно сделать чтобы ловить ошибку мемяцы на пролет.

    G> Ну как ты там еще объясняешь? О, тяжелая артилерия. Попроси меня поверить тебе на слово. Все это разбавь безграмотными рассуждениями.


    Твоими? Или это ты наглядно демонстрируешь как ты не хамишь?

    G>Репутацию свою ты уже не испортишь, а, как говорил поручик Ржевский, "можно и впердолить".


    Ну, о моей репутации слава богу не тебе судить. Ты ее тут даже не сумел заработать. Так что Ржевский — молчать. (с)
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[15]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:56
    Оценка: -1
    Здравствуйте, INTP_mihoshi, Вы писали:

    VD>>2Lloyd: У тебя конвульсии или ты случайно на минус все время попадаешь? Это уже как-то не серьезно.


    INT>Рефлекс на нарушение пятого пункта полиси


    Явно какой-то заклинивший. Нечто вроде тика. Да и дело модератора следить за нарушениями. А то как-то следит только за моими. Причем мерещатся они везде. Вроде даже голосование создал. Его все послали куда полдальше...

    Да мне даже забавно. Но итересны мотивы.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[15]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:56
    Оценка:
    Здравствуйте, Lloyd, Вы писали:

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


    VD>>2Lloyd: У тебя конвульсии или ты случайно на минус все время попадаешь? Это уже как-то не серьезно.


    L>2VladD2: нет, это не конвульсии и не случайность. это адекватная реакция на твое хамское неуважение к аппонентам.


    Ну, предположим назовем мои слова "хамское неуважение к аппонентам" хотя звучит довольно смешно. "Хамское неуважение". Но что такого хамского ты нашел, например, в этом: Re[12]: Сильные стороны функционального программирования
    Автор: VladD2
    Дата: 04.09.04
    сообщении? И почему тогда ты ненашел ничего хамского в данном? Не кажется ли тебе, что свое явно предвзятое суждение о человеке ты выливашь в толпу минусов? И не наводит ли тебя на мысль, что тебя в большинстве случаев не поддерживат даже те кто спорит со мной?

    Почему я не видел ни одного твоего минуса даже на окровенные оскарбления тем же Gaperton других участников форума?

    Re[10]: ФЯ
    Автор: Gaperton
    Дата: 20.08.04

    Re[10]: Сильные стороны функционального программирования
    Автор: Gaperton
    Дата: 01.09.04

    Re[8]: Сильные стороны функционального программирования
    Автор: Gaperton
    Дата: 01.09.04


    Двойные стандарты?

    ЗЫ

    Чесное слово. Просто любопыткно.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[21]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:56
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    VD>>Тяжело говорить с людьми не умеющими понять, что собеседник демострирует абсурдность их логики.

    G>...не зная при этом Хаскеля, о чем открыто заявляет. Браво.

    Ну, кричать браво стольк вопиющей демагогии у меня желания нет.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[17]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:56
    Оценка: -2
    Здравствуйте, Quintanar, Вы писали:

    VD>>Ну, то есть мы сошлись на едином мнении о том, что все слова об ужасах побочных эффектов — это притянутая за уши фигня?


    Q>Нет.


    Странно.

    Q>Не в этом дело.


    А...

    Q> Я писал одну немаленькую программу на SML (часть компилятора) и, хотя я использовал там императивные фичи, проблем с ними я не имел. Поскольку они были изолированы в коде и привести к ошибкам не могли, поскольку их использование носило вспомогательный характер. Соответственно проблемы с side-effects не было.


    А я вот писал на Шарпе где 90% импиративно, и проблем с ними так же не имел. Это является достаточным чтобы развить теорию о приемуществе ИЯ? Нет? А почему тогда ты считашь, что твоих доводы достаточны?

    Q>В HAskell'e сторонние эффекты недопустимы, поскольку там должно выполнятся правило, что при вызове функции с одними и теми же аргументами должно возвращаться одно и то же значение.


    Рад за него. В С++ тоже есть слова const не доупускающее побочных эффектов. Но намного более надежным С++ от этого не становится. В Шарпе подобной фичи нет. А надежность на нем намного выше. Вывлд — надежность кода слабо связано с наличием возможности создания побочных эффектов. Идиология Хаскеля делает упор на одно. Иделогия Шарпа на другое. В итоге оба достигают своего. Кстати, главной фичей приводящей к полвышению надежности в обоих языках видится отсутствие прямой работы с указателями. Это куда более весомый аспект. Ну, еще типобезопасность. Эти фактор постоянно ухудшают надежность С++-приложений. И именно из-за них надежность С++-програм низка. Так что если ты перенесешь свои сравнения с С++ на C#, то процентов 80 твоих доводов улитучится сами собой.

    Q> Но при обмене данными с внешним миром такое правило, очевидно, выполняться не может.


    Что ж тут очевидного? Тут очевидна слабая доказательная база.

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


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

    Q>В OCaml ситуция другая. Там принят другой способ вызова функций — по значению, а не по имени (т.е. когда параметры функции вычисляются только в случае необходимости) и поэтому проблем с императивщиной там меньше. Компилятор может сам понять, есть ли side-effects в данной функции. Но в целом они там нужны только для ввода-вывода, каких-то вычислительных задач типа сортировки и хранения глобального состояния программы, чтобы не таскать его по всему коду в качестве аргумента.


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

    У ФЯ есть много других приемуществ, чтобы не пытаться превознести их на столь второстипенных вещах. Функции высшего порядка и патерн-матчинг намного более интересные явления. Согласись, что нет особых проблем встроить в ИЯ средства контроля за побочными эффектами и передачу параметров в стиле макросов. Это все фигня.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[21]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:56
    Оценка: -1
    Здравствуйте, Quintanar, Вы писали:

    Q>Естественно, в С# можно эмулировать ленивые вычисления, точно так же, как на ассемблере можно писать в объектно ориентированном стиле. Вопрос насколько это красиво, удобно и понятно.


    Хороший вопрос. Можно его обсудить. Шарп — это язык относящийся к ООЯ. А этот класс языков основной своей задачей ставит (в твоей терминалогии) эмуляцию любой функциональности на основе инкапсуляции и полиморфизма. Есть давольно бесхистросные паттерны позвляющие работать с довольно сложными понятиями и сущностьями так как будо бы они встроены в язык.

    Q> Ленивые вычисления в Haskell'е врожденная черта. Чтобы ими пользоваться не нужно предпринимать никаких дополнительных действий, думать как да что.


    Здорово. Но с другой стороны — это же является и плохой чертой, так как не позволяет (когда это нужно) более плотно контролировать поведение программы. Да и не настолько сложно то о чем ты говоришь реализуется на Шарпе.

    Q>Вот, например, вычисление простых чисел методом решета:


    Честно говоря порядком надоело смотреть на все эту очужденную от жизни фигню. Ты в своей работе часто получаешь список простых чисел? Я вот ни разу не получал. А если и получал, то мне хватало обычного цикла. Зачем эмлировать последовательность из примитивного алгоритма? А вот где в жизни действительно нужны эти ленивые вычисления? Я вот припоменаю только потоковый вод/вывод вроде передачи данных по сокетоам. Но там есть объект типа стрим который решает все проблемы.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[24]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:57
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Подавляющие время занял вывод.


    А зачем ты его измерял?

    WH>легко...


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

    Q>>Кстати, OCaml, думаю, вообще не проиграл бы в производительности, поскольку на него твою программу можно перенести 1 в 1.

    WH>Если писать императивно. Кстати напиши. И сравним производительность

    Действительно было бы интересно. Прадва о приемуществах ФЯ тут говорить уже нельзя. Да и выглядеть программа будет лучше на ИЯ, так как императивный варинт все же.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[19]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:57
    Оценка: -2
    Здравствуйте, Gaperton, Вы писали:

    G>Ты как в очередной раз споришь сам с собой, выдумывая что говорит собеседник.


    Недадо мне припысывать чужих заслуг.

    G>Никто не говорил про "нельзя".


    Да? А это чьи слова:

    G>Итераторы были-бы ленивыми, если бы значение элемента контейнера вычислялось в момент доступа к нему по итератору, т. е. было отложенным до момента чтения. Ух, какие это жесткие грабли в ИЯ! Брр!


    G> Речь о том, что ленивые вызовы опасны при наличии побочных эффектов.
    Может ты начнешь наконец тратить время на чтение сообщений?

    Речь о том, что кто-то поняв что был не прав начал выкручиваться и переключать контекст обсуждения.

    Что до опасности, то я уже как-то говорил (раз 30), что сотни тысяч прграммистов использующих Шарп и Яву как-то не замечают этих опасностей. Иными словми имеет место намеренное завышение опасности.

    И вообще, зачем фичу одного языка превращать в достоинства всего функционального подхода? В шарпе линивые вычисления возможны просто по тому, что есть ссылочные типы данных сопособные реализовывать любую логику абстрагируя ее под единым интерфейсом. Подход несколько иной, но тоже ничем не хуже. В определенных ситуациях дает очень хороший эффект.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[17]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:57
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    VD>>Рад за тебя. Вот только кроме тебя были и другие люди пишущие код. И у некоторых из них он таки работал.

    G>Эта система успешно работает более 10 лет . Четыре фермы серверов, самая крупная — в Чикаго.

    Зачем тогда приводеть ее в качестве негативного примера? Или есть такая же система написаная на чистом ФЯ работающая 10 лет и не имевшая никаких проблем при разработке?

    G>Я эксперт по С++ .


    Скромно и очень доказательно.

    G> И ведущий специалист компании по архитектуре данного приложения, sardonix не даст соврать.


    Я в общем то верю и так. Хоя ссылка на какого-то sardonix-а явно выглядит смешно.

    G> Работает оно великолепно, Влад, для приложения такого объема написанного на С++. Опыт у нас исключительно положительный.


    Тогда сейчас ты сильно себе противоречишь.

    G> И за последние 5 лет накоплена большая статистика по дефектам production-а, чтобы можно было достоверно говорить о причинах этих дефектов. Через меня и мою группу их прошла примерно тысяча (часть которых была вызвана тем, что SQA запутались в требованиях) — точно посмотреть не могу, т. к. пишу из дома.


    Откровенно говоря 1000 для стольк масштабного продукта — это очень не много.

    Ну, да фиг с ним. Какое это отношение имеет к ФЯ? Еще раз спрашиваю, почему при столь "явных" приемуществах ФЯ вы не выкинули С++ к чертям собачим и не переписали все на том же Хаскле?

    G>Не сложнее, чем на С#,


    Тут кто-то говорил мне о том, что я рссуждаю о Хаскеле не зная его? Не ты ли это был? Тогда что же ты не укоришь себя в том же? Я то о технических вопросах все же не рассуждал. А вот в дмнном случае ты разговариваеш о том, в чем явно ничего не смыслишь.

    Писать код, и особенно отлаживать приложения на Шарпе на порядки проще чем на С++. В языке и рантайме предпринято множество мер упрощающих отладку. Самое смешное, что практически те же фичи ускоряют и упрощают отладку и ФЯ. Фичи эти хорошо извесны: строгий контроль типов, отсуствие ручного управления памятью, контрль рантайма.

    G> если конечно умеешь пользоваться языком.


    Сдается мне, что мои знания С++ не меньше твоих. По крайней мере проработав на этом языке 10 лет я имею право рассуждать о его достоинствах и недостатках. Так что предлагаю избежать измерения пенисов.

    G> Вот уж с чем нет проблем, так это с управлением памятью, если руки растут откуда надо (если придерживаться строгой ownership policy). Ну, и работая с С++ не стоит увлекаться COM-объектами. И все будет в порядке.


    В порядке может и будт. Но приложения будут получаться очень похожие на мамонтов. Для серверов мамонто-подобность может и ничего, но вот одна беда. Серверы на плюсах выходят очень ненадежными и отлаживаются очень долго. Собственно дотнет в первую очередь и проектировался для простого и быстрого создания серверных решений. Вот этот сайт, кстати, работает на дотнете и почти весь код написан на Шарпе. Много ты сможешь назвать веб-серверов чей прикладной код написан на С++? А на Хаскеле? Хотя последнее конечно уже из другой оперы.

    В общем, слушать тебя смешно. С++ надежен, Шарп неимеет никаких приемуществ, а вот Хаскель... Полная фигня. Серверы все больше и больше пишутся на Шарпе. Причем в основном из-за того, что это проще и надежнее. Да и не серверы тоже. Даже клиент к этому сайту написан на Шарпе. А вот есть ли подобные сайты и клиенты написанные на Хаскеле?

    G>Поправлю. Не отладки, а сложность поддержки и цену внесения изменений. Не путай, это совсем разные вещи.


    Ты говорил и конкретно об отладке. Не нужно перепрыгивать. Но даже если говорить о "цену внесения изменений" и поддержке, то тут тоже твой любимый Хаскель вряд ли сможет тягаться с Шарпом или Явой просто потому, что для них создан целый ворох приложений, утилит, и мощьнейших IDE которые делают эти процессы простыми как три копейки. Хотя конечно без должного проектирования можно все превратить в кашу. Тебе как архитектору это должно быть известно. И нет проблем превратить в кашу самый что не наесть функциональный код. Как говорится с дуру можно и ... сломать.

    G>Потому, что сидел над своим кодом, который тебе знаком.


    Ошибашся. К сожалению мне приходилось сидеть и за чужим кодом. Но на Шарпе отладка настолько проста и код насктолько хорошо читается, что о дне отладки, а уж темболее о неделе или месяце говорить не приходится. Просто ты отстал от жизни. Сосредоточился на ФЯ, а кроме них и другие области вперед продвинулись.

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


    Я тебе уже несколько раз говорил. Код пишишь только ты. И знаешь тоже только ты.
    В общем, убрал бы ты свое самомнение. Изходи из того, что с тобой разговаривают не менее опытные люди чем ты сам. А то просто противно разговаривать. Сенсей, блин.

    G>Подобные проблемы имеют обыкновение выглядеть как сложные зависимости в алгоритмах.


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

    G> А вообще, при исправлении дефектов всегда сложность состоит в том, чтобы понять ситуацию.


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

    G> И при неопределенном порядке вычислений и наличии побочных эффектов это очень сложно.


    Еще раз повторю. Не нужно рассказывать сказки. 20 минут на самую сложную ошибку. При создании того же парсера для R#-а намного сложнее было создать верную граматику, нежели найти мелкие ошибки. При более-менее человеческом дизайне они отлавливаются в секунды.

    G> Часто приходится встраивать в программу trace, ждать несколько дней, когда ситуация повторится, а потом долго разбирать trace, сопоставляя с кодом (чаще всего чужим, и правленным несколькими людьми), и пытаясь сообразить, как такое могло получиться.


    Твой плюсовый опыт уже начинает надоедать. Поверь есть люди живущие по другому. Именно по тому многие мнее опытные и выбирают Шарп, что в нем не нужно сидеть недели на пролем с трэйсом.

    G> И ты знаешь, иногда (редко) понять не получается, и приходится применять симптоматическое лечение — клиенты ждать не хотят!


    Назвал то как! "симптоматическое лечение"! По простому — это называется заплатки/замазки, или сопли. Понятно что если продукт уже у заказчика, то иной раз не обойтись. Но намного лучше просто не доводить до подобного. И опять же когда ошибка ищится за пять минут, то подобные проблемы встречаются намного реже.

    G>Кстати, может прекратим "меряться пиписьками"? А то ты меня провоцируешь.


    Ты это затеял. Так что не нужно про "провокации". Я тебе всего лишь заметил, что проекция твоего плюсового опыта на все ИЯ несколько некореектна. Вернее совсем некорректна. Это ты начал гордые заявления об экспертности и годах (не спрасив об оных у абонента).
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[18]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:57
    Оценка:
    Здравствуйте, hrg, Вы писали:

    hrg>Чувааааак. Это же DOOM! Возможно даже 1-й. А это как минимум 8 лет назад


    Даже если брать второй, то уже 9. Второй дум вышел в 95-ом. Ух и резались мы тогда в него.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[17]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:57
    Оценка: 6 (1)
    Здравствуйте, Lloyd, Вы писали:

    L>Влад, а можно вопрос личного характера?


    Да, я не против. Хотя судя по твоим минусам ты рьяный борец за политкорректность, а борцам данного фронта такие вопросы явно не к лицу.

    L>У тебя в профайле написано, что ты являешься техническим редактором журнала и насколько я помню, это у тебя в профайле по крайней пере пару лет уже записано.


    Точнее три. Собственно сайту примерно столько лет.

    L> Судя по пикче, которая у тебя в профайле же, тебе не очень много лет.


    Ну, рассуждения на базе возраста уж точно никак не вяжутся с политкорректностью.

    L> Думаю вряд ли взрослый серьезный человек будет в качестве своего фото пихать картинку из компьютерной игры.


    Ну, тут есть разные варианты. Первное лучше меньше думать. А то можно, например, нашего Алекса Фетодова на соновании вот этого линка http://gzip.rsdn.ru/Info/Team.aspx записать черти в кого.

    Во вторых можно быть молодым и серьезным. Или взрослым, но не серьезным. А можно быть взрослым серьезным, но не человеком.

    L> По моим прикидкам тебе вряд ли получается больше чем 25-27 лет.


    Получается немного больше. Мне сейчас 30. Но не думаю, что это может повлиять на серьезность или не серьезность.

    L> Вычтем из этого возраста 2 года, что ты являешься техническим редактором журнала.


    Уж незнаю зачем вычитать (хотя конечно было бы не плохо )...

    L> Получается, плотно программированием ты занимался максимум до 23-25 лет, т.к.


    Ну, точнее 28.

    L> после этого ты был уже не программистом.


    Это от чего же? Что-же со мной такое произолшо?

    L> Думаю, наверняка у тебя высшее образование, т.е. плотно работать ты начал в лучшем случае где-то в 22 года.


    Могу назвать год — 94. Было это ровно 10 лет назад.

    L> Путем насложной арифметики получаем, что плотно программирование ты занимался не больше 3-х лет.


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

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


    О... Мне даже не кажется что мои выводы безапеляционны. А уж прво на выводы я точно считаю главным завоеванием демократии.

    ЗЫ

    Если серьезно, то о знаниях и умениях других лучше судить по их делам. А заниматься арифметикой с возрастом и темболее делать на ее базе далего идущие выводы (по простому пытаться унижать других) точно не стоит. А моих знаниях и умениях очень просто судить по моим статьям и продуктам в создании которых я принимал участие. Думаю тебе не составит труда ткнуть мышкой в мой профайл еще раз и прочитать все мои статьи, а так же поглядеть библитеки и продукты на которые я давал ссылки. Ну, и вообще-то данный экскурс можно было бы начать с изучения рейтикга и оценок. Поверь минусы там занимают далеко не основное место. Опять же подчеркну, что я тыкаю в рейтинг именно из-за того, что ты довольно бесцеремнонно взялся рассуждать о моем возрасте и знаниях.

    Я конечно понимаю, что простым и порой слишком вольным общением я раздражаю часть людей. Особенно склонных к пуританству. Но что же поделаешь? Мне так больше нравится жить. Если я вижу что-то с чем я не согласен, я просто говорю об этом. И авторитетом для меня являются больше те чье мнения мне кажется более логичным и непротиворечивым, а так же труд которых я видел лично. Так что если охота в чем-то убедить, то нужно вывалить факты, а не пытаться взять "весом".
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[9]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 07.09.04 00:57
    Оценка: +2
    Здравствуйте, Gaperton, Вы писали:

    G>Ну кто-то может и двадцать лет этим заниматься, и так и не понять, как такие вещи делать просто. А там на самом деле существует простая технология. Я бы с тобой поделился, но ...


    Срадостью полсушал бы. А пока...

    VD>> В прочем... похоже ты просто любишь "крикнуть" какую-нибудь глупость по громче, чтобы другие по возмущались.

    G>...после такого, не считаю возможным продолжать беседу. Потому как ты совсем охренел.

    К сожалению "такое" имеет быть на практике. Ты постоянно делаешь завяления вроде того, что на ИЯ невозможны линивые вычисления, а потом, после того как тебе несколько человек обяснит вто ты не прав, начинаешь доказывать что такого не говорил и вообще тебя все неверно поняли.

    Я понимаю, что ФЯ для тебя болеш чем просто парадигма. Понимаю, что человек ты не равнодушный. Это здорово. Но те методы которыми ты пыташся доказать другим свою правоту явно неадекватны и вызвают в слушателях сильное раздражение. Забвно, что я как раз не являюсь противником, но после общения с табой почему-то начинаю их тихо недолюбливать. Странно правда. Более того, я предлагал перейти к человеческим формам популяризации ФЯ. Но дальше чем на одну ветку и маленький и крайне не убедительный документ вас не хватило. Моим словам об окончании флэйма ты с сотоварищами не внял и продолжаешь довольно некачетственную пропоганду. Когда же я называю вещи свими именами ты откровенно обижашся. Ну, уж извините. Я вот такой прямолинейный. Если я вижу рекламу и пропаганду под видом несения в массы разумного, доброго и вечного я так и говрою — реклама и пропаганада.

    Заметь как реагируют на твои слова те многие кто видит в ФЯ рациональное зерно, но не является полным приверженцем ФЯ. Через некоторое время они встречаются с безапеляционными спорными заявлениями и попросу уходят. Те немногие что остались уже устали спорить.

    ЗЫ

    В общем, все эти "базары" действительно нужно прекращать. Если есть желание помочь другим в постижении принципов ФЯ и популяризации идй ФЯ, то нужно сосредоточиться на документе о котором мы говорили. Если у вас не получается создать его самостоятельно, то давайте делать это в интерактивном режиме. Но чур не обижаться на критику, а воспринимать ее как цель создания полноценного убидительного документа. Исходите из того посыла, что если текст покажется убедительным мне, то он будет убедительным и для 80% других императивщиков.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: Разница есть
    От: _Obelisk_ Россия http://www.ibm.com
    Дата: 07.09.04 07:18
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Знаю. Только известные мне SDL тулзы очень дорогие (кинь ссылки, если знаешь халяву, плз). Но в любом случае, иногда приходится делать КА и руками.


    Какие-то тулы перечислены тут http://www.sdl-forum.org/Tools/Shareware.htm
    Хотя я не думаю, что они лучше комерческих продуктов. (Что представляют собой комерческие тулы я знаю,у нашего отдела контракт с Telelogic-ом ).
    На общественных началах можно разработать front-end к SDL (парсер, внутренее представление, боле-менее приемлемый semantic checker), но все остальное (GUI, code generators, run-time system, etc) делается с большим трудом.Особенно, принимая во внимание требование кроссплатформенности.


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


    Пишут, но не у нас. И до нас они не доходят, приходится на amazon-е заказывать. Блин, полно литературы для "чайников", но чего-либо серьезного, выходящего за рамки автоматизации бизнес-процессов, практически нема.



    Душа обязана трудиться! (с) Н.Заболоцкий.
    Re[4]: Сильные стороны функционального программирования
    От: faulx  
    Дата: 07.09.04 07:41
    Оценка:
    Здравствуйте, little_alex, Вы писали:


    _>Некоторые алгоритмы на ФЯ не перепишешь.


    А пример?
    Re: Сильные стороны функционального программирования
    От: faulx  
    Дата: 07.09.04 08:01
    Оценка: :)))
    Интересная ссылка, вызывающая некоторые ассоциации.
    Re[20]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 07.09.04 10:17
    Оценка: -1
    Здравствуйте, VladD2, Вы писали:

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


    G>>Ты как в очередной раз споришь сам с собой, выдумывая что говорит собеседник.


    VD>Недадо мне припысывать чужих заслуг.


    G>>Никто не говорил про "нельзя".

    VD>Да? А это чьи слова:
    VD>

    G>Итераторы были-бы ленивыми, если бы значение элемента контейнера вычислялось в момент доступа к нему по итератору, т. е. было отложенным до момента чтения. Ух, какие это жесткие грабли в ИЯ! Брр!

    Я не вижу здесь слова "нельзя". Здесь идет речь об итераторах, как о способе доступа к контейнеру. И утверждается, что такие итераторы не ленивые.

    G>> Речь о том, что ленивые вызовы опасны при наличии побочных эффектов.
    Может ты начнешь наконец тратить время на чтение сообщений?

    VD>Речь о том, что кто-то поняв что был не прав начал выкручиваться и переключать контекст обсуждения.

    Речь о том, что ты ничего не понял с самого начала. А повыделываться охота. Вот начало ветки. http://www.rsdn.ru/Forum/Message.aspx?mid=789032&amp;only=1
    Автор: Gaperton
    Дата: 01.09.04
    Так что оставь эти песни для других.

    VD>Что до опасности, то я уже как-то говорил (раз 30), что сотни тысяч прграммистов использующих Шарп и Яву как-то не замечают этих опасностей. Иными словми имеет место намеренное завышение опасности.


    Ты можешь повторить это хоть 50 раз. Однако синклер и большинство остальных почему-то поняли сразу, о чем речь.
    Re[6]: Сильные стороны функционального программирования
    От: little_alex  
    Дата: 07.09.04 10:35
    Оценка:
    Здравствуйте, Silver_s, Вы писали:

    S_> А вобще это все к вопросу о скорости выполнения, вычислительной сложности итд.


    А какое отношение это имеет к моему вопросу?Подразумевалось straightforward реализация......
    Re[12]: Сильные стороны функционального программирования
    От: Poudy Россия  
    Дата: 07.09.04 10:37
    Оценка:
    Здравствуйте, faulx, Вы писали:

    F>Пересказываю часть статьи своими словами. Вот вспомните пример с алгоритмом альфа-бета эвристики. Если бы у нас не было в распоряжении ленивых вычислений (а точнее говоря — ленивых, потенциально бесконечных структур данных), то модуль генерации возможных позиций (дерева игры) и модуль выбора оптимального хода были бы тесно связаны между собой: либо они были бы одним модулем, либо пришлось бы вводить сущность вроде итератора, которая, опять же, тесно связана с модулем генерации дерева и т.п.

    Ну а так модуль связан со средой языка. То, что язык предоставляет нетипизированные списки ничего не говорит толкового о модульности. Я могу на C# сделать зашибись модульную программу, в которой все функции принимают и возвращают object[].

    F> С бесконечными структурами данных все просто — один модуль генерирует бесконечное дерево, другой модуль выбирает оптимальный ход с учетом этого дерева. Друг о друге эти модули ничего не знают, и не нужны им никакие итераторы — достаточно самой структуры данных.

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


    F>Аналогия (все аналогии ущербны, а эту я придумал только что, но все равно приведу ее). Из крана льет вода, если его открыть и не льет, если закрыть. Тебе все равно, откуда в этом кране вода, с какой именно водонапорной башни (или что там у них) она подведена к крану. А теперь представь, что для того, чтобы принять душ, тебе надо набирать телефон водонапорной башни (это аналог итератора) и звонить туда, заказывая нужное количество воды. Ну и в какой схеме выше модульность?

    Здесь ключевое не "все равно", а количество операций. На самом деле вода в твоем кране конечно же зависит от того, где башня. Но знание этого не входит в твою компетенцию. Если бы набор телефона осуществлялся автомитически при повороте тобой крана, то не было бы проблем. ФЯ предоставляют тебе инфраструктуру, в которой многое делается без непосредственного кодинга. Однако. Мэйнстрим ратует не только за укорачивание кода, но также и за управляемость. Достаточно вспомнить сколько было шума из-за оператора new в C++ и сборщика мусора в .NET
    Re[18]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 07.09.04 12:03
    Оценка: :)
    Здравствуйте, VladD2, Вы писали:

    VD>>>Рад за тебя. Вот только кроме тебя были и другие люди пишущие код. И у некоторых из них он таки работал.

    G>>Эта система успешно работает более 10 лет . Четыре фермы серверов, самая крупная — в Чикаго.
    VD>Зачем тогда приводеть ее в качестве негативного примера? Или есть такая же система написаная на чистом ФЯ работающая 10 лет и не имевшая никаких проблем при разработке?

    Читай ниже. 4-й абзац.

    G>>Я эксперт по С++ .

    VD>Скромно и очень доказательно.
    "То что ты все время говоришь о плюсах и о своем неудачном опитые всего лишь говорит о том, что твои скилы на плюсах меньше чем нужно чтобы решить данную проблему." — Скромно и очень доказательно. Все кругом дураки, один ты умный. Я рад был бы тебе ответить: да, я на самом деле такой тупой, каким ты меня считаешь. Но не могу, это была-бы неправда.

    G>> И ведущий специалист компании по архитектуре данного приложения, sardonix не даст соврать.

    VD>Я в общем то верю и так. Хоя ссылка на какого-то sardonix-а явно выглядит смешно.
    Какой-то sardonix — мой коллега, который сидит на соседнем этаже. И если я скажу неправду, он напишет опровержение.

    G>> Работает оно великолепно, Влад, для приложения такого объема написанного на С++. Опыт у нас исключительно положительный.

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

    G>> И за последние 5 лет накоплена большая статистика по дефектам production-а, чтобы можно было достоверно говорить о причинах этих дефектов. Через меня и мою группу их прошла примерно тысяча (часть которых была вызвана тем, что SQA запутались в требованиях) — точно посмотреть не могу, т. к. пишу из дома.

    VD>Откровенно говоря 1000 для стольк масштабного продукта — это очень не много.
    Это дефекты, найденные тестерами на фазе интеграции. А не те мелочи, над которыми ты сидишь в отладчике по 5 минут. Продукту примерно лет 15. Его постоянно развивали в течении этих лет. Над ним в разное время одновременно работало несколько групп общим количеством до 50 человек. Моя группа (в разное время от 2 до 8 человек) занималась подсистемой обработки данных. Работаю я здесь 5 лет (статистика за период примерно 4 года). Считай, много это, или мало.

    VD>Ну, да фиг с ним. Какое это отношение имеет к ФЯ? Еще раз спрашиваю, почему при столь "явных" приемуществах ФЯ вы не выкинули С++ к чертям собачим и не переписали все на том же Хаскле?

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

    G>>Не сложнее, чем на С#,

    VD>Тут кто-то говорил мне о том, что я рссуждаю о Хаскеле не зная его? Не ты ли это был? Тогда что же ты не укоришь себя в том же? Я то о технических вопросах все же не рассуждал. А вот в дмнном случае ты разговариваеш о том, в чем явно ничего не смыслишь.

    Если тебе приятно так думать , то ради бога. Шарпы такая немеряно сложная штука, что программисту на С++ их так просто не понять. И лучше наверно молчать в тряпочку.

    VD>Писать код, и особенно отлаживать приложения на Шарпе на порядки проще чем на С++.

    Ты знаешь что такое "на порядки"? Это больше чем в 100 раз. Оставь эти песни для других.
    Наша статистика не подтверждает ни такого увеличения производительности , ни такого увеличения качества.

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

    Что ты тут пропаганду разводишь? Не надо следить за освобождением памяти, вот и все. Экономит (чаще) от 5 до (в редких случаях) 25% времени разработки. Зато: нет множественного наследования и нельзя создавать объекты на стеке. Вот что замечает большинство людей в первую очередь, переходя с С++ на С#. И они от этого не в восторге.

    Справедливости ради надо похвалить remouting, компонентную модель, и библиотеки. Удобно. Но к "отладке" это не относится.

    G>> если конечно умеешь пользоваться языком.

    VD>Сдается мне, что мои знания С++ не меньше твоих. По крайней мере проработав на этом языке 10 лет я имею право рассуждать о его достоинствах и недостатках. Так что предлагаю избежать измерения пенисов.
    Так не меряйся.

    VD>В общем, слушать тебя смешно. С++ надежен, Шарп неимеет никаких приемуществ, а вот Хаскель... Полная фигня. Серверы все больше и больше пишутся на Шарпе. Причем в основном из-за того, что это проще и надежнее. Да и не серверы тоже. Даже клиент к этому сайту написан на Шарпе. А вот есть ли подобные сайты и клиенты написанные на Хаскеле?

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

    G>>Поправлю. Не отладки, а сложность поддержки и цену внесения изменений. Не путай, это совсем разные вещи.

    VD>Ты говорил и конкретно об отладке. Не нужно перепрыгивать.
    Ссылку где я это так конкретно говорил. Хватит врать. Задергался, гляди ка.

    VD>Но даже если говорить о "цену внесения изменений" и поддержке, то тут тоже твой любимый Хаскель вряд ли сможет тягаться с Шарпом или Явой просто потому, что для них создан целый ворох приложений, утилит, и мощьнейших IDE которые делают эти процессы простыми как три копейки.

    Понятно. Не понимаешь, что такое "цена внесения изменений". Утилиты и мощнейшие IDE, ее снижают, надо же .

    VD>Хотя конечно без должного проектирования можно все превратить в кашу. Тебе как архитектору это должно быть известно.

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

    G>>Потому, что сидел над своим кодом, который тебе знаком.

    VD>Ошибашся. К сожалению мне приходилось сидеть и за чужим кодом. Но на Шарпе отладка настолько проста и код насктолько хорошо читается, что о дне отладки, а уж темболее о неделе или месяце говорить не приходится. Просто ты отстал от жизни. Сосредоточился на ФЯ, а кроме них и другие области вперед продвинулись.
    Да вот такой я отсталый. Не знаю прелестей отладки в седьмой студии, исскуственный интеллект которой находит ошибки за 5 минут вместо одной недели.

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

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

    G>>Подобные проблемы имеют обыкновение выглядеть как сложные зависимости в алгоритмах.

    VD>А какая мне тогда нафиг разница какой я парадигмы придерживаюсь? Если есть логическая ошибка, то ее осмысление зависит только от степени гибкости мозга.
    Тебе — без разницы. Пиши на ассемблере. Умища должно хватить.

    G>> А вообще, при исправлении дефектов всегда сложность состоит в том, чтобы понять ситуацию.

    VD>Не всегда. Как раз на плюсах очень часто возникают ошибки которые не свзаны с ошибкой непосредственно.
    Пардон?

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

    Ошибки такой природы (связанные с повреждением памяти) у нас в релиз попадают крайне редко, а потому проблемой не являются, и группой тестеров находятся редко. Это во первых. Во вторых, за немотивированный "проход по памяти" в плюсах — по рукам. Нехрен. Здесь вам не С.

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


    Не верю ((с) Станиславский). Не нужно рассказывать сказки.

    G>> И при неопределенном порядке вычислений и наличии побочных эффектов это очень сложно.

    VD>Еще раз повторю. Не нужно рассказывать сказки. 20 минут на самую сложную ошибку. При создании того же парсера для R#-а намного сложнее было создать верную граматику, нежели найти мелкие ошибки. При более-менее человеческом дизайне они отлавливаются в секунды.
    Ты вместо того, чтобы повторять ерунду всякую, прочитал бы предложение, на которое отвечаешь. Где это ты в парсере видал неопределенный порядок вычислений? Парсеры вообще штука простая и прямолинейная. Если знать теорию. И особенно, если пользоваться генератором

    G>> Часто приходится встраивать в программу trace, ждать несколько дней, когда ситуация повторится, а потом долго разбирать trace, сопоставляя с кодом (чаще всего чужим, и правленным несколькими людьми), и пытаясь сообразить, как такое могло получиться.

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

    G>> И ты знаешь, иногда (редко) понять не получается, и приходится применять симптоматическое лечение — клиенты ждать не хотят!

    VD>Назвал то как! "симптоматическое лечение"! По простому — это называется заплатки/замазки, или сопли. Понятно что если продукт уже у заказчика, то иной раз не обойтись. Но намного лучше просто не доводить до подобного. И опять же когда ошибка ищится за пять минут, то подобные проблемы встречаются намного реже.
    Умные все стали. "До такого лучше не доводить". Нет, мы специально берем и доводим до такого. Ну не хватает ума у нас за 5 минут найти ошибку, на которую спец по подсистеме (не по языку!) тратит день, а не спец — неделю как рыба об лед.

    Но теперь я знаю, что если то же самое написать на C# или Java, то любой человек с улицы найдет любую ошибку за 5 минут.

    G>>Кстати, может прекратим "меряться пиписьками"? А то ты меня провоцируешь.

    VD>Ты это затеял. Так что не нужно про "провокации". Я тебе всего лишь заметил, что проекция твоего плюсового опыта на все ИЯ несколько некореектна. Вернее совсем некорректна. Это ты начал гордые заявления об экспертности и годах (не спрасив об оных у абонента).
    Абонент не отвечает, или временно не доступен. Ты мне всего-лишь заметил, что я плохо знаю плюсы, ничего не понимаю в итераторах, рассказываю сказки про дефекты, не понимаю по русски, итд. То есть ты перешел на личности. Нехорошо.
    Re[13]: Сильные стороны функционального программирования
    От: faulx  
    Дата: 07.09.04 12:21
    Оценка:
    Здравствуйте, Poudy, Вы писали:

    P>Ну а так модуль связан со средой языка.

    Все модули, написанные на каком-либо языке, связаны со средой этого языка. Что в этом плохого?

    P> То, что язык предоставляет нетипизированные списки ничего не говорит толкового о модульности. Я могу на C# сделать зашибись модульную программу, в которой все функции принимают и возвращают object[].


    Кажется, тут какое-то недопонимание. При чем здесь нетипизированные списки?


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


    Просто здесь не делается различия между "форматом данных" и "интерфейсом итератора". Если мы используем итератор по дереву, мы тоже (возможно, неявно) предполагаем некоторую структуру за этим итератором. Где документирована эта структура?

    Сформулирую еще раз. При ленивом подходе не нужна отдельная сущность "итератор". Сама структура данных служит передадочным звеном. Media is the message, так сказать

    P>Здесь ключевое не "все равно", а количество операций. На самом деле вода в твоем кране конечно же зависит от того, где башня. Но знание этого не входит в твою компетенцию. Если бы набор телефона осуществлялся автомитически при повороте тобой крана, то не было бы проблем. ФЯ предоставляют тебе инфраструктуру, в которой многое делается без непосредственного кодинга. Однако. Мэйнстрим ратует не только за укорачивание кода, но также и за управляемость. Достаточно вспомнить сколько было шума из-за оператора new в C++ и сборщика мусора в .NET


    Так что, C++ и .NET — это не мэйнстрим?
    Re[10]: Сильные стороны функционального программирования
    От: Павел Леонов Россия icq: 138726397
    Дата: 07.09.04 18:38
    Оценка: :)
    Здравствуйте, VladD2, Вы писали :

    V> документа. Исходите из того посыла, что если текст покажется

    V> убедительным мне, то он будет убедительным и для 80% других
    V> императивщиков.

    А если его пойму я, то можно будет начинать в школе преподавать.
    Posted via RSDN NNTP Server 1.9 gamma
    Re[16]: Fuzzy и Call-by-callback в ФЯ?
    От: ON  
    Дата: 07.09.04 19:49
    Оценка:
    From: Nick_
    ON>А можно ссылку на G-машину?
    >Припоминаю только описание STG-машины
    >http://citeseer.ist.psu.edu/peytonjones92implementing.html
    >Есть еще обзорная статья по абстрактным машинам
    >http://citeseer.ist.psu.edu/diehl00abstract.html

    Спасибо, многое прояснилось.


    Еще вопросы, кто-нибудь ответит?
    Нечеткая логика в ФЯ. Если любая переменная может принимать сразу множество значений, а логика описывает только работу с одним значением, тогда нужно вычислять все ветви и получать многомерный результат. Для этого требуется расширять язык или можно сделать в рамках того же? Любую переменную можно заменить списком переменных, полиморфизма ФЯ хватит?

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

    Совсем замечательно было бы, если бы лямбда, куда подставляем пакет, могла заказать у этого пакета переменную некоторого типа, то есть даем пакету тип и получаем такую переменную если там есть такая. Такое вообще, бывает? Какой-нибудь Call-by-callback?

    Или как более частный случай — значения "по умолчанию", в ФЯ не предусмотрены? Т.е. если есть что подставлять, то считаем переменную свободной и подставляем, если нечего, то вычисляем со значением по умолчанию. Это не совсем подстановка, а скорее подмена. Это тоже можно сделать не расширяя язык? Наверно, можно это сделать с обертками вроде MayBe, но тут мне кажется принципиальыный вопрос, требуется нечто среднее между строгим языком т.к. обертку нужно разворачивать, и нестрогим т.к. с тем, что в обертке нужно работать уже в lazy режиме.
    Posted via RSDN NNTP Server 1.9 gamma
    Re[17]: Fuzzy и Call-by-callback в ФЯ?
    От: Quintanar Россия  
    Дата: 07.09.04 20:42
    Оценка: 8 (1)
    ON>Нечеткая логика в ФЯ. Если любая переменная может принимать сразу множество значений, а логика описывает только работу с одним значением, тогда нужно вычислять все ветви и получать многомерный результат. Для этого требуется расширять язык или можно сделать в рамках того же? Любую переменную можно заменить списком переменных, полиморфизма ФЯ хватит?

    Не могу сказать в целом, но одновременное вычисление возможно в отдельных случаях. Например, монадный парсер из примеров к Haskell'ю вычисляет сразу несколько альтернатив. Монада-список очень похожа на то, что ты хочешь.
    Ее тип [a] -> (a -> [b]) -> [b]. Т.е. для всех элементов a списка вычисляется результат список [b], а потом результаты объединяются.

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

    ON>Совсем замечательно было бы, если бы лямбда, куда подставляем пакет, могла заказать у этого пакета переменную некоторого типа, то есть даем пакету тип и получаем такую переменную если там есть такая. Такое вообще, бывает? Какой-нибудь Call-by-callback?

    Из-за строгой типизации не может быть функции, возвращающей разные типы. Можно только эмулировать бестиповость. Объявить тип типа
    data NoType = Integer Int | Str String | MyType1 ... | ....

    И работать с ним методом списка.

    ON>Или как более частный случай — значения "по умолчанию", в ФЯ не предусмотрены? Т.е. если есть что подставлять, то считаем переменную свободной и подставляем, если нечего, то вычисляем со значением по умолчанию. Это не совсем подстановка, а скорее подмена. Это тоже можно сделать не расширяя язык? Наверно, можно это сделать с обертками вроде MayBe, но тут мне кажется принципиальыный вопрос, требуется нечто среднее между строгим языком т.к. обертку нужно разворачивать, и нестрогим т.к. с тем, что в обертке нужно работать уже в lazy режиме.


    Значения по умолчанию есть в O'Caml. В Haskell'e придется объявлять дополнительные функции.
    create_array num elem = ....
    cerate_array_0 num = create_array num 0


    На самом деле значения по умолчанию опасны в ФЯ по следующей причине
    my_func x y = x + y
    result = my_func 1

    Если бы x или y имел значение по умолчанию, здесь возникла бы 3-ная неоднозначность. f _ 1, f 1 _, f 1 (как частичная функция)
    Re[12]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 08.09.04 19:08
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    G>>У меня предложение попроще, способное на порядок поднять культуру общения. Давайте Чистякоа перестанет хамить и переходить на личности.


    VD>То что ты называешь хамством другие называют называть вещи своими именами. Или говорить правду. Что же до хамства, то не тебе об этом говорить. Кажется не я поднял вопрос о быдляцких манерах (или что там было быдляцкого?).


    Ну, то что свое хамство ты считаешь "называнием вещей своими именами" и "говорением правды", я в курсе. И по моему ясно высказал свое мнение на эту тему. Блин. Ты русский язык понимаешь? (пример называния вещей своими именами) Судя по твоим сообщениям — нет. (а этот оборот, тоже из тебя — это я правду говорю.)

    Что же до хамства и быдляцких манер, то сосчитай минусы, которых ты нахватал в той ветке, рассуждая на эту тему. Ллойда можешь вычесть, все равно неплохо останется. Так что может мне об этом и не говорить, а уж тебе то точно на эту тему молчать. Впрочем, это не твой метод .
    Re[16]: Сильные стороны функционального программирования
    От: Lloyd Россия  
    Дата: 08.09.04 20:45
    Оценка: 1 (1) +1
    Здравствуйте, VladD2, Вы писали:

    L>>2VladD2: нет, это не конвульсии и не случайность. это адекватная реакция на твое хамское неуважение к аппонентам.


    VD>Ну, предположим назовем мои слова "хамское неуважение к аппонентам" хотя звучит довольно смешно. "Хамское неуважение".


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

    VD>Но что такого хамского ты нашел, например, в этом: Re[12]: Сильные стороны функционального программирования
    Автор: VladD2
    Дата: 04.09.04
    сообщении?


    Ну во первых кнопочка с минусом называется "Не согласен". А что касается именно этого сообщения, то понимай это как "я не согласен, что без качественной затравки в виде статейки ..."

    VD>И почему тогда ты ненашел ничего хамского в данном? Не кажется ли тебе, что свое явно предвзятое суждение о человеке ты выливашь в толпу минусов?


    Ну откуда у меня может быть о тебе предвзятое суждение? Мое мнение о тебе могло сформировалось только исключительно по постам в те форумы, что я читаю. Ах да, забыл. Есть же еще профиль. Но и там вроде ничего преступного нет. Так что твое предположение неверно.

    VD>И не наводит ли тебя на мысль, что тебя в большинстве случаев не поддерживат даже те кто спорит со мной?


    Ну я бы не сказал, что совсем уж не поддерживают.

    VD>Почему я не видел ни одного твоего минуса даже на окровенные оскарбления тем же Gaperton других участников форума?


    Ок. Давай посмотрим.

    VD>Re[10]: ФЯ
    Автор: Gaperton
    Дата: 20.08.04


    Посмотри сообщение выше по ветке. Со стороны Gaperton-а это была совершенно нормальная реакция.

    VD>Re[10]: Сильные стороны функционального программирования
    Автор: Gaperton
    Дата: 01.09.04


    Аналогично.

    VD>Re[8]: Сильные стороны функционального программирования
    Автор: Gaperton
    Дата: 01.09.04


    Та же фигня.

    VD>Двойные стандарты?


    Отнюдь. Очень даже одинарные.

    VD>ЗЫ


    VD>Чесное слово. Просто любопыткно.


    Всегда пожалуйста.
    ... << RSDN@Home 1.1.4 @@subversion >>
    Re[16]: Сильные стороны функционального программирования
    От: Lloyd Россия  
    Дата: 08.09.04 20:45
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Явно какой-то заклинивший. Нечто вроде тика.


    Дружок, не заклинивайся на себе. Если ты считаешь себе центром вселенной, то поверь мне, ты сильно ошибаешься.

    VD>Да и дело модератора следить за нарушениями. А то как-то следит только за моими. Причем мерещатся они везде. Вроде даже голосование создал. Его все послали куда полдальше...


    Ху из послал меня подальше? Администраторы — члены rsdn-team?

    VD>Да мне даже забавно. Но итересны мотивы.


    Повторяешься, просмотри мои ответы на твои посты. И ты увидишь мотивы.
    ... << RSDN@Home 1.1.4 @@subversion >>
    Re[19]: Сильные стороны функционального программирования
    От: Lloyd Россия  
    Дата: 08.09.04 20:45
    Оценка: :))) :)
    Здравствуйте, Gaperton, Вы писали:

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


    Не будь к нему так строг. Ему тоже не просто. 200 сообщений в неделю — думаю ты тоже многое бы забыл.
    ... << RSDN@Home 1.1.4 @@subversion >>
    Re[21]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.09.04 01:31
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>>>Никто не говорил про "нельзя".

    VD>>Да? А это чьи слова:
    VD>>

    G>Итераторы были-бы ленивыми, если бы значение элемента контейнера вычислялось в момент доступа к нему по итератору, т. е. было отложенным до момента чтения. Ух, какие это жесткие грабли в ИЯ! Брр!

    G>Я не вижу здесь слова "нельзя". Здесь идет речь об итераторах, как о способе доступа к контейнеру. И утверждается, что такие итераторы не ленивые.

    О! Снова какие-то выверты. Про контейнер ты все сам додумал. И слова "были-бы ленивыми" никак подругому интерпретировать нельзя. Были бы, значит не были. Зачем предпологать то что и так является фактом?

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

    VD>>Речь о том, что кто-то поняв что был не прав начал выкручиваться и переключать контекст обсуждения.

    G>Речь о том, что ты ничего не понял с самого начала.



    G> А повыделываться охота.




    G> Вот начало ветки. http://www.rsdn.ru/Forum/Message.aspx?mid=789032&amp;only=1
    Автор: Gaperton
    Дата: 01.09.04
    Так что оставь эти песни для других.


    Да, забавная особенность. Даже сам понял, что был не прав, но продолжашь честно смотря в глаза чмырить других. Браво!

    G>Ты можешь повторить это хоть 50 раз. Однако синклер и большинство остальных почему-то поняли сразу, о чем речь.


    Спросим у Синклера? Или у большинства других? Особенно забавно про "большинствао" .
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[19]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.09.04 01:31
    Оценка: -3
    Здравствуйте, Gaperton, Вы писали:

    G>"То что ты все время говоришь о плюсах и о своем неудачном опитые всего лишь говорит о том, что твои скилы на плюсах меньше чем нужно чтобы решить данную проблему." — Скромно и очень доказательно. Все кругом дураки, один ты умный. Я рад был бы тебе ответить: да, я на самом деле такой тупой, каким ты меня считаешь. Но не могу, это была-бы неправда.


    Ну, ты как нибудь определись все же.

    G>Какой-то sardonix — мой коллега, который сидит на соседнем этаже. И если я скажу неправду, он напишет опровержение.


    Ты уже тут заливал не однократно и что-то sardonix-ов видно при этом небыло. Да его просто не видно. Видимо ему твои тирады просто безразличны.

    VD>>Тогда сейчас ты сильно себе противоречишь.

    G>Заработать можно заставить все что угодно, вопрос в цене.

    Ну, ты все же определись. Так работало оно великолепно, или каке-как добились работоспособности. А то как-то то тсую, то туда.

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


    Дык я тебя и спрашиваю. Вы когда писали все это ты про ФЯ знал? Что не применил то? Зачем силы тратили?

    VD>>Откровенно говоря 1000 для стольк масштабного продукта — это очень не много.

    G>Это дефекты, найденные тестерами на фазе интеграции. А не те мелочи, над которыми ты сидишь в отладчике по 5 минут.

    Ну, типа у нас ОШИБКИ, а у вас каки-то жалкие бажки.

    G> Продукту примерно лет 15. Его постоянно развивали в течении этих лет. Над ним в разное время одновременно работало несколько групп общим количеством до 50 человек. Моя группа (в разное время от 2 до 8 человек) занималась подсистемой обработки данных. Работаю я здесь 5 лет (статистика за период примерно 4 года). Считай, много это, или мало.


    А зачем мне считать? Бессмыслицей является вообще какие либо выводы о всех ИЯ на базе этого опыта. Ведь не факт что этот проект вообще заработал бы с приемлемой производительностью будь он написан на ФЯ. И не факт, что сложность не сократилась бы раз в 10 если бы вместо С++ был бы Шарп. Вернее факт, что сократилась бы.

    VD>>Ну, да фиг с ним. Какое это отношение имеет к ФЯ? Еще раз спрашиваю, почему при столь "явных" приемуществах ФЯ вы не выкинули С++ к чертям собачим и не переписали все на том же Хаскле?

    G>Потому, что ни один дурак не бросится переписывать работающую и приносящую деньги систему в несколько миллионов строк, в разработку которой вложены огромные деньги. Честно говоря надоело разжевывать тебе прописные истины.

    Ну, по твоим же словам увеличение только произодительности программиста минимум в 4 раза. А поддержку вообще сравнивать нельзя. Да при таких раскладах (если конечно все это не треп) брось вы С++ даже на половине готовности вы бы закончили быстрее бы и качество было бы куда выше. Тут у тебя вная не стыковочка.

    G>>>Не сложнее, чем на С#,

    VD>>Тут кто-то говорил мне о том, что я рссуждаю о Хаскеле не зная его? Не ты ли это был? Тогда что же ты не укоришь себя в том же? Я то о технических вопросах все же не рассуждал. А вот в дмнном случае ты разговариваеш о том, в чем явно ничего не смыслишь.

    G>Если тебе приятно так думать ,


    А тут и думать нечего. Ты своим незнанием гордишся.

    G> то ради бога. Шарпы такая немеряно сложная штука, что программисту на С++ их так просто не понять. И лучше наверно молчать в тряпочку.


    Не пробовал, не знашь, но заявления делашь. Изумительно! Да что уж молчание в тряпочку, хотя бы малейшее сомнение с твоей стороны тут было бы куда уместнее. Но "ты же у нас всегда прав" (с).

    VD>>Писать код, и особенно отлаживать приложения на Шарпе на порядки проще чем на С++.

    G>Ты знаешь что такое "на порядки"? Это больше чем в 100 раз. Оставь эти песни для других.

    На порядки — это более чем в 10 раз. Или у тебя без ФЯ проблемы с вычислениями.

    G>Наша статистика не подтверждает ни такого увеличения производительности , ни такого увеличения качества.


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

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

    G>Что ты тут пропаганду разводишь?

    Я? Ух ты. А я грешным делом на тебя подумал. Думаю, сидит травит байки про супер приемущества ФЯ всегда и во всем. А оказывается это был я.

    G> Не надо следить за освобождением памяти, вот и все.


    Мастер! Откуда у тебя такие познания то глубокие? За ночь что ли освоил все. Так я тебя огорчу. Ты 90% возможностей проглядел. GC конечно вещь полезная, но она не одна. Фич направленных на безопасность очень много. Так что низнаеш ты в данном случае нихрена о предмете разговора вот и все.

    G> Экономит (чаще) от 5 до (в редких случаях) 25% времени разработки. Зато: нет множественного наследования и нельзя создавать объекты на стеке.


    О! Какие познания! Жаль только видимо не там. Так как объекты в стеке как раз создавать можно. В языке типы данных как раз на две группы делятся: ссылочные и вэлью-типы. Последние можно создавать в стеке и будучи помещенными в другие объеты они становятся их частью, а не ссылкоу (в том числе хранятся в массивах по значению). Так что ты явно с чем-то Шарп спутал. Видимо слышал что-то о Яве и ассоциировал ее с Шарпом.

    G> Вот что замечает большинство людей в первую очередь, переходя с С++ на С#.


    Не поверишь! Я как раз с плюсов и переходил. И еще языков 7 знал. Отсуствие МН по началу действительно казалось проблемой. Потом правда оказалось, что не смертельная проблема и с лихвой компенсируется упращением разработки.

    G> И они от этого не в восторге.


    G>Справедливости ради надо похвалить remouting, компонентную модель, и библиотеки. Удобно. Но к "отладке" это не относится.


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

    VD>>Сдается мне, что мои знания С++ не меньше твоих. По крайней мере проработав на этом языке 10 лет я имею право рассуждать о его достоинствах и недостатках. Так что предлагаю избежать измерения пенисов.

    G>Так не меряйся.

    Так ты все гордишся длинной и изгибом.

    VD>>В общем, слушать тебя смешно. С++ надежен, Шарп неимеет никаких приемуществ, а вот Хаскель... Полная фигня. Серверы все больше и больше пишутся на Шарпе. Причем в основном из-за того, что это проще и надежнее. Да и не серверы тоже. Даже клиент к этому сайту написан на Шарпе. А вот есть ли подобные сайты и клиенты написанные на Хаскеле?

    G>Смешной ты человек.

    Я то? Да...

    G> Не помнишь даже, к чему это я про С++.


    Ну, как же? Ты проталкивал идею о том, что ФЯ значительно проще и безопаснее чем ИЯ так как у тебя был жуткий опыт траха с С++ и небыло с ФЯ. На возражение о том, что не все ИЯ одинаково полезны, ты начал тщетно доказывать, что все и что это явное доказательство твоих слов. В пылу доказательств не поверил в то, что и Шарп значительно проше и удобнее чем С++ ну, и т.п.

    G> Напомню. Ты предположил, что наша аппликуха не работает.


    Я предположил?

    G>Я тебя поправил. Ты предположил, что это потому, что я не знаю С++ на достаточном уровне, чтобы такое писать.


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

    G> Я тебя поправил. Теперь ты говоришь, что слушать меня смешно, потому что я якобы говорю, что С++ супернадежный язык. Сам с собой ведешь беседу, вобщем. В автономный режим перешел.


    А можт быть все было несколько иначе? Может быть ты предположил, что на С++ тяжело писать большие сложные проекты, и что единственным решением является переход на ФЯ (который вы в прочем не сделали)? А я предположил, что вместо ФЯ с тем же успехом можно было бы просто взять Шарп? А ты предположил, что Шарп фигня так как в нем кроме ЖЦ ничего нет и стал уверять, что тебе изучать что-то не нужно чтобы рассуждать о его возможностях?

    VD>>Ты говорил и конкретно об отладке. Не нужно перепрыгивать.

    G>Ссылку где я это так конкретно говорил.

    Ну, вот ту, наприер:

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


    Или речь шала о дефектах проектировния? А может (страшно подумать! ) о дефектах мозга пользователей?

    G>Хватит врать.


    И правда, конча!

    G> Задергался, гляди ка.


    Это ты параллельно на себя в зеркало что ли смотриш и реакцию записываешь?

    VD>>Но даже если говорить о "цену внесения изменений" и поддержке, то тут тоже твой любимый Хаскель вряд ли сможет тягаться с Шарпом или Явой просто потому, что для них создан целый ворох приложений, утилит, и мощьнейших IDE которые делают эти процессы простыми как три копейки.

    G>Понятно. Не понимаешь, что такое "цена внесения изменений".

    Ну, куда мне убогому. Вот сэнсэй он все знает. Щаз носом тыкнет.

    G> Утилиты и мощнейшие IDE, ее снижают, надо же .


    А ты как-нибудь оторвись от размышлений о судьбе ФЯ и глянь современные IDE. Ну, там Эклипс, VS 2005, Решарпер и т.п. Там есть такие фичи как рефакторин. Забавнейшая вещь надо сказать. Позволяет делать громадные изменения кода довольно просто, быстро и без ошибок.

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

    G>Это всем известно.

    Ну, а тогда зачем проблемы недопродуманности проецировать тонь на ИЯ? Что на ФЯ нельзя довести проект до развала?

    G> Да вот такой я отсталый. Не знаю прелестей отладки в седьмой студии, исскуственный интеллект которой находит ошибки за 5 минут вместо одной недели.


    Ну, ты познакомься. Хотя уже давно пора с 8-ой знакомиться. Да и не в студии дело. С отладкой С++ хотя тоже изменения произошли, но до дотнета она не дошла. Все же язык имеет свои особенности.

    G>Ты чо это заграничными непонятными словами обзываешься?


    У тебя учусь.

    G> На себя посмотри, сам такой . Например, на абзац выше.


    Я про твой опыт начинаю говорить, когда ты им пытаешся помахать в воздухе. Надоели слова вроде "ты в чужой код изменения не вносил". Я лет пять только и занимлся, что правил чужой код. Что мне перед тобой теперь отчитываться. Запомни по умолчанию, катят только факты. Все попытки сказать, что кто-то чего-то не делал идут в лес.

    VD>>А какая мне тогда нафиг разница какой я парадигмы придерживаюсь? Если есть логическая ошибка, то ее осмысление зависит только от степени гибкости мозга.

    G>Тебе — без разницы. Пиши на ассемблере. Умища должно хватить.

    То есть типа провел аналогию между всеми ИЯ по сравнению с ФЯ и ассемблером по сравнению с ИЯ. Вот только для того, чтобы такие аналогии проводить нужно еще сходность черт доказать. А без того это дешевый демагогический прием. В общем, неумелая подколка.

    Логическая ошибка и на ассемблере будет таковой. Другое дело, что на ассемблере вероятность того, что имеется и не логическая ошибка намного больше. А вот ФЯ и ИЯ такой пропости нет. Многие вещи что легко пишутся императивно выглядят в рекурсивной, функциональной записи более чем плохо. И чтобы найти там логическую ошибку мозг прийдтся поставить раком. Так что умища может не хватить.

    VD>>Не всегда. Как раз на плюсах очень часто возникают ошибки которые не свзаны с ошибкой непосредственно.

    G>Пардон?

    Про ошибки второго и третьего порядка, или в просторечье налаженку слышал?

    G>Ошибки такой природы (связанные с повреждением памяти) у нас в релиз попадают крайне редко, а потому проблемой не являются, и группой тестеров находятся редко.


    Позволь усомниться. Не думаю, что в той же команде Ворда сидят менее талантливые люди, но вот у них почему-то проходы по памяти живут в релизах и переходят из версии в версию. Да и тогда совсем не ясно, что вы там искали месяцы на пролет (вдвоем) и так и не нашли.

    G> Это во первых. Во вторых, за немотивированный "проход по памяти" в плюсах — по рукам. Нехрен. Здесь вам не С.


    Да за любую ошибку премию не дадут. Но на плюсах без тех же вызовов АПИ вряд ли обойдешся. И не факт, что все параметры заданы верно. Безобидыный вроде с виду код может привести к порче байтика, тат в свою очередь запортит другой, а где-нибудь в другом месте программы в 100%-но корректном участке кода грохнет. И будете вы сидеть тот самый месяц но так ошибку и не найдете. А в типобезопасном Хаскеле или Окамле такую ошибку сделать невозможно принципиально. Вот тебе и значительное приемущество в простоте отладки. Вот только в Шарпе с этим тоже проблем нет, так как невозможно обойти систему типов, а вызовов АПИ на порядки меньше, да и те защищаются так, что если и грохнет, то сразу.

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


    G>Не верю ((с) Станиславский). Не нужно рассказывать сказки.


    Фома не верующая (с) народная мудрость. Зайди на форум по дотнету и спроси. Думаю, там тебе каждый подтвердит.

    И вообще, зачем верить? Сядь и попробуй. Ты же сам говоришь, что для стольк опытного человека как ты изучить какой-то там язык без МН проблем не сотавит. Глядишь тогда и взгляды изменятся.

    G>>> И при неопределенном порядке вычислений и наличии побочных эффектов это очень сложно.

    VD>>Еще раз повторю. Не нужно рассказывать сказки. 20 минут на самую сложную ошибку. При создании того же парсера для R#-а намного сложнее было создать верную граматику, нежели найти мелкие ошибки. При более-менее человеческом дизайне они отлавливаются в секунды.
    G>Ты вместо того, чтобы повторять ерунду всякую, прочитал бы предложение, на которое отвечаешь. Где это ты в парсере видал неопределенный порядок вычислений?

    Дык он же на ИЯ. А "в них побочные эффекты". Ну, а "неопределенный порядок вычислений" создается просто неопределенностью потока данных. Исходники знае те ли... Бежит набор токенов (кстати именно поток в котором можно толучать только следующий токен) и нужно их анализировать какое бы причудливое сочетание они не составляли бы.

    G> Парсеры вообще штука простая и прямолинейная. Если знать теорию. И особенно, если пользоваться генератором


    Да если не пользоваться генератором, то эта простая штука до белого коления может довести. Правда ФЯ так круты, что немного не ясно зачем они им. Но ведь есть же? Да и не такая простая штука эти парсеры если язык сложную граматику имеет.

    G>Ну-ну. Волшебные шарпы уменьшают цену исправления дефекта в 50 раз.


    Да порой просто устраняет возможность их появления. Это даже в процентах не измерить. Но ты же не повеириш? Ведь на это способны только ФЯ.

    G> Наверно, благодаря отсутствию адресной арифметики и операторов delete. Смешно.


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

    G>>> И ты знаешь, иногда (редко) понять не получается, и приходится применять симптоматическое лечение — клиенты ждать не хотят!

    VD>>Назвал то как! "симптоматическое лечение"! По простому — это называется заплатки/замазки, или сопли. Понятно что если продукт уже у заказчика, то иной раз не обойтись. Но намного лучше просто не доводить до подобного. И опять же когда ошибка ищится за пять минут, то подобные проблемы встречаются намного реже.
    G> Умные все стали. "До такого лучше не доводить". Нет, мы специально берем и доводим до такого. Ну не хватает ума у нас за 5 минут найти ошибку, на которую спец по подсистеме (не по языку!) тратит день, а не спец — неделю как рыба об лед.

    Ума у вас не хватило на то чтобы взять другой язык или вообще не писать код, а например его генерировать. Но ты же не поверишь, что без ФЯ можено упростить программирование и отладку?

    G>Но теперь я знаю, что если то же самое написать на C# или Java, то любой человек с улицы найдет любую ошибку за 5 минут.


    Опять дешевые трюки. "любой человек с улицы". Зачем передергивать? Не любой конечно, но именно, что вместо месяца отладка сведется к десяти минутам, максимум к паре часов. Естественно если в результате анализа станет ясно, что ошибка в проекте и нужно перелопатить его десятую часть, то тут ничего не попишешь. Но установить проблему можно довольно быстро.

    Вообще, забавно, что ты восхваля ФЯ даже не задумался, что во многом это достоинства строгой типизации и контроля, а не самой парадигмы как таковой.

    G>Абонент не отвечает, или временно не доступен.




    G> Ты мне всего-лишь заметил, что я плохо знаю плюсы


    Я? Где? Цитату в студию!

    G>, ничего не понимаю в итераторах,


    Ну, это ты просто таки доказывал на протяжении нескольких постов споря с Синклером. Правда потом вроде де бы до тебя дошло.

    G> рассказываю сказки про дефекты, не понимаю по русски, итд. То есть ты перешел на личности. Нехорошо.


    Да? А я то думал не хорошо тыкать других носом и говорить, что они что-то там не знают, при этом вообще не удостоверившись в том, что они знаю, а что нет. Так же думл, что не хорошо говорить про себя "я эксперт". Думал, что не здорово говорить собеседнику про "быдляцкие манеры". Или чтобы они нихрена не понимают и что с ними разговривать не охота. А оказывается это все хорошо. А замечать об этом плохо, так как переходит на обсуждение личности оппонента. Во оно как?...
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[13]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.09.04 01:31
    Оценка: -5
    Здравствуйте, Gaperton, Вы писали:

    G>Ну, то что свое хамство ты считаешь "называнием вещей своими именами" и "говорением правды", я в курсе.


    Кстати, а ты в курсе как разывается твое хамсвто? Да и вообще в курсе о его существовании?

    G> И по моему ясно высказал свое мнение на эту тему.


    Ага помню. Я тебе как-то дико оскорбил фразой "тут ты не прав".

    G> Блин. Ты русский язык понимаешь? (пример называния вещей своими именами) Судя по твоим сообщениям — нет. (а этот оборот, тоже из тебя — это я правду говорю.)


    И?

    G>Что же до хамства и быдляцких манер, то сосчитай минусы, которых ты нахватал в той ветке, рассуждая на эту тему.


    И что мне их считать? Они от трех человек в основном. Хочешь тебе тут тоже трое четверо минусов нафигачет? Пойми просто есть адекватные люди не разбрасывающиеся своими оценками на право и на лево. А то они ведь деградируют от частого применения. Если бы этоту ветку прочитали бы по болше людей, то думаю было бы и море плюсов. Но этоти фанатичные разборки просто никто уже читать не хочет. Вот и получается, что сидишь ты с Лойдом (который вообще минусы на право и на лево расставляет) и лепиш минусы по чем зря. Ну, да хорошо хоть в одной теме. А то вон Мика вообще случая не упустит чтобы минус жмякнуть. Ну, а я рад. Поклонник все же.

    Ты вот свои минусы что-то не считашь. А тебе их точно не чтобы насолить ставят.

    G> Ллойда можешь вычесть,


    Дык если его вычесть, то остаешся в основном ты. Остальные ставят минусы довольно редко. Так же ставят еще плюсы и оценки. Хотя мне как то на это наплевать. Хочется и ставят.

    G> все равно неплохо останется.


    Ну, да. Ты не скупишся.

    G> Так что может мне об этом и не говорить, а уж тебе то точно на эту тему молчать. Впрочем, это не твой метод .


    Кстати, хочешь эксперемент? Вскажи все что ты тут про Шарп налепил в отдельной теме или (что еще лучше) в форуме по дотнету. Я тебе гарантирую несколько десятков минусов. Просто этот бред обычные люди дочитать не могут. Тут остались только те кто слишком не равнодушен к ФЯ.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[14]: Сильные стороны функционального программирования
    От: WFrag США  
    Дата: 09.09.04 02:56
    Оценка: +3
    Здравствуйте, VladD2, Вы писали:

    VD>Просто этот бред обычные люди дочитать не могут. Тут остались только те кто слишком не равнодушен к ФЯ.


    Ну типа спасибо, приголубил. Нравится мне, как ты уверенно вещаешь... Откуда данные-то?
    Re[17]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.09.04 03:24
    Оценка: :)
    Здравствуйте, Lloyd, Вы писали:

    L>Дружок, не заклинивайся на себе. Если ты считаешь себе центром вселенной, то поверь мне, ты сильно ошибаешься.


    Да я вот тоже думал, что центром вселенского зла не являюсь. Но глядя на твое нерное тыканье на минсу начинаю сомниваться в своих "думах".

    L>Ху из послал меня подальше? Администраторы — члены rsdn-team?


    Да что-ты... послали люди. Там народ пунктик создал "удалить эту провакацию" (или что-то вроде того). А админы просто с дури выполнили требование. А потом народ еще два дня искал голосование в пусорке чтобы скриншот сделать для "Колеги улыбнитесь".

    VD>>Да мне даже забавно. Но итересны мотивы.


    L>Повторяешься, просмотри мои ответы на твои посты. И ты увидишь мотивы.


    Да ответы то есть, а вот мотивы как-то так ясными и не становятся. Хотя в принципе понятно.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[17]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 09.09.04 03:24
    Оценка:
    Здравствуйте, Lloyd, Вы писали:

    L>Ну во первых кнопочка с минусом называется "Не согласен". А что касается именно этого сообщения, то понимай это как "я не согласен, что без качественной затравки в виде статейки ..."


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

    VD>>И почему тогда ты ненашел ничего хамского в данном? Не кажется ли тебе, что свое явно предвзятое суждение о человеке ты выливашь в толпу минусов?


    L>Ну откуда у меня может быть о тебе предвзятое суждение?


    Да? Откуда?

    L> Мое мнение о тебе могло сформировалось только исключительно по постам в те форумы, что я читаю. Ах да, забыл. Есть же еще профиль. Но и там вроде ничего преступного нет. Так что твое предположение неверно.


    Предположение о чем? Не не может же быть так, что ты видишь только мое хамство, и хамство АВК. А хамство Gaperton становится лично для тебя невидимым? Ну, и уж точно не поверю, что ты согласен со всем что говорится в форумах так как не ставишь минусы на каждый пост.

    VD>>И не наводит ли тебя на мысль, что тебя в большинстве случаев не поддерживат даже те кто спорит со мной?


    L>Ну я бы не сказал, что совсем уж не поддерживают.


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

    VD>>Почему я не видел ни одного твоего минуса даже на окровенные оскарбления тем же Gaperton других участников форума?


    L>Ок. Давай посмотрим.


    VD>>Re[10]: ФЯ
    Автор: Gaperton
    Дата: 20.08.04


    Правда? "Быляцкие манеры" раз и на всегда заткнувшие рот Larm-а — это не хамство? Как интересно! А за что же он был удостоен такой чести? Он как-то оскорбил кого-то? Да и куда ты там лазил по ветке вверх? Это было первое и последнее сообщение Larm-а в этой теме.

    L>Посмотри сообщение выше по ветке. Со стороны Gaperton-а это была совершенно нормальная реакция.


    VD>>Re[10]: Сильные стороны функционального программирования
    Автор: Gaperton
    Дата: 01.09.04


    L>Аналогично.


    И здесь все ОК? И здесь ты что-то выискал вверх по ветке? Маладэс. Ай браво. Честный судья. Главное лубиш судать. Это приятно. Ну, а то что после этого хамства Glоbus так же прекратил всякое общение с Gaperton — это уже мелочи. Так?

    VD>>Re[8]: Сильные стороны функционального программирования
    Автор: Gaperton
    Дата: 01.09.04


    L>Та же фигня.


    Кто бы сомневался.

    VD>>Двойные стандарты?


    L>Отнюдь. Очень даже одинарные.


    Это радует. Я вообще считаю, что самое обидное это посредственность. Ее не замечают. А такая принципиальность таки просто не может не радовать.

    VD>>Чесное слово. Просто любопыткно.


    L>Всегда пожалуйста.


    Всегда сапасибо. Приятно видеть человека честного, непредвзятого и с чистой совестью.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[20]: Сильные стороны функционального программирования
    От: Павел Леонов Россия icq: 138726397
    Дата: 09.09.04 06:12
    Оценка: :))) :))) :))
    Здравствуйте, VladD2, Вы писали:

    VD>Да? А я то думал не хорошо тыкать других носом и говорить, что они что-то там не знают, при этом вообще не удостоверившись в том, что они знаю, а что нет. Так же думл, что не хорошо говорить про себя "я эксперт". Думал, что не здорово говорить собеседнику про "быдляцкие манеры". Или чтобы они нихрена не понимают и что с ними разговривать не охота. А оказывается это все хорошо. А замечать об этом плохо, так как переходит на обсуждение личности оппонента. Во оно как?...


    Сообщение ТАСС:

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



    Re[20]: Сильные стороны функционального программирования
    От: INTP_mihoshi Россия  
    Дата: 09.09.04 07:39
    Оценка: 1 (1) +5
    Здравствуйте, VladD2, Вы писали:

    G>>Какой-то sardonix — мой коллега, который сидит на соседнем этаже. И если я скажу неправду, он напишет опровержение.


    VD>А зачем мне считать? Бессмыслицей является вообще какие либо выводы о всех ИЯ на базе этого опыта. Ведь не факт что этот проект вообще заработал бы с приемлемой производительностью будь он написан на ФЯ. И не факт, что сложность не сократилась бы раз в 10 если бы вместо С++ был бы Шарп. Вернее факт, что сократилась бы.

    Э... Да!? Я думал, что только в 9.87... Ну, максимум в 9.9. А оказывается, аж в 10. И это факт. Надо же...

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

    G>>Наша статистика не подтверждает ни такого увеличения производительности , ни такого увеличения качества.

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

    G>> На себя посмотри, сам такой . Например, на абзац выше.

    А ты кто такой? Нет, это ты кто такой?

    Дох.. Много флейма скиппед.

    Господа, может быть, вы аськами обменяетесь и персонально порулитесь а? А то потом самим же стыдно быдет.

    Gaperton, ты еще в те выходные собирался вводную статью написать. Если время, потраченное на флейм с Владом...

    Vald2D, ты не мог бы слова по делу не разбавлять переходами на личности и едоказанными утверждениями? Очень трудно выуживать.


    ИМХО, C# и OCaml сравнимы по качеству и удобству применения. OCaml специализируется на "специальных" задачах (в основном, свяанных с метапрограммированием), C# на "бытовых". В своих направлениях они — лучшие. В чужих — вполне жизнеспособные. Вполне можно подобрать условия, когда один будет проигрывать другому на порядок.
    Re[22]: Сильные стороны функционального программирования
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 09.09.04 07:56
    Оценка: :)))
    Здравствуйте, VladD2, Вы писали:
    VD>Спросим у Синклера?
    Не, давай не будем. Я что-то уже нить вашей дискуссии потерял. О чем и не жалею, т.к. пенисометрия мне мало интересна.
    ... << RSDN@Home 1.1.4 beta 1 >>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[18]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 09.09.04 15:46
    Оценка: +1
    Здравствуйте, VladD2, Вы писали:

    VD>>>Re[10]: ФЯ
    Автор: Gaperton
    Дата: 20.08.04


    VD>Правда? "Быляцкие манеры" раз и на всегда заткнувшие рот Larm-а — это не хамство? Как интересно!

    Бедный, бедный Larm!

    VD>А за что же он был удостоен такой чести?

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

    VD>Он как-то оскорбил кого-то?

    Весь город. Во-первых, он неуважительно отозвался о самом факте критики шарпов со стороны "плюсовиков". Для тупых: смотри слово "завывания". Ну а во вторых, он адресовал это Гапертону, ни за что ни про что фактически называв его слова "завываниями", а вещи о которых он рассказывает — "гадостью" (что впрочем уже мелочи).

    За подобный стиль общения в приличном обществе вполне можно схватить в хлебало. Для особо тупых, кто не понимает, что так себя вести не стоит. Но кое-кто видимо отвык от хороших манер. Субкультура, понимаешь. Это я не о Larm — одно сообщение это не система.

    Кстати, я думаю что он не написал больше ничего по более прозаической причине — ему просто не интересно. И я это понимаю.

    VD>>>Re[10]: Сильные стороны функционального программирования
    Автор: Gaperton
    Дата: 01.09.04

    L>>Аналогично.
    VD>И здесь все ОК? И здесь ты что-то выискал вверх по ветке? Маладэс. Ай браво. Честный судья. Главное лубиш судать. Это приятно. Ну, а то что после этого хамства Glоbus так же прекратил всякое общение с Gaperton — это уже мелочи. Так?

    И правильно сделал — я ведь ему сказал, что "мне неинтересно с тобой общяться". И ничего кроме. И не вижу, кстати, в этом никакого хамства и личной трагедии Globus-а. Я сильно удивлюсь, если он сейчас напишет, что расстроен этим фактом.

    А вообще, я очень рад. Я очень вежливый человек, если в поисках "вопиющего хамства Gaperton-а" это самое вопиющее, что тебе удалось найти.
    Re[18]: Fuzzy и Call-by-callback в ФЯ?
    От: ON  
    Дата: 09.09.04 16:18
    Оценка:
    From: Quintanar

    Про свое я еще подумал, получается нужно чтобы значения не просто подставлялись, а надо сделать полноценную интерпретацию одного куска данных другим — аргумент заменяет не только свободные переменные но и контекст, сам интерпетатор. При вызове f(x), x подставляется не только в аргумент функции f, но и в контексте что-то меняет. Хотя на первый взгляд получится как если бы запускать код, созданный под один конкретный процессор на другом совершенно несовместимом. Ну да ладно.

    >Монада-список очень похожа на то, что ты хочешь.


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

    >На самом деле значения по умолчанию опасны в ФЯ по следующей причине

    >my_func x y = x + y
    >result = my_func 1
    >Если бы x или y имел значение по умолчанию, здесь возникла бы 3-ная неоднозначность. f _ 1, f 1 _, f 1 (как частичная >функция)

    Неоднозначность с Y получается потому, что запятых нет. В Бейсике пищут "Find ,,0,1". Если по номеру аргумента не понятно, мужно как-то указывать имя
    result = my_func y<-1
    А без имен и запятых можно договориться, что за первый агрумент считать тот, что первый, тогда ясно что 1 пойдет в X, а по Y считаем либо частичную функцию либо берем значение по-умолчанию. Популярные языки либо умирают, либо "развиваются" — заимствуют друг у друга. Можно понять программистов с опытом — посмотрит на Хаскель, потыкает и делает вывод: "Не жилец". Вот если бы на Xacкель понимал исходник С++, как С++ понял обычный С, может быть что-то и вышло.
    Posted via RSDN NNTP Server 1.9 gamma
    Re[19]: Fuzzy и Call-by-callback в ФЯ?
    От: Nick_ Россия  
    Дата: 09.09.04 16:50
    Оценка:
    Здравствуйте, ON, Вы писали:

    >>На самом деле значения по умолчанию опасны в ФЯ по следующей причине

    >>my_func x y = x + y
    >>result = my_func 1
    >>Если бы x или y имел значение по умолчанию, здесь возникла бы 3-ная неоднозначность. f _ 1, f 1 _, f 1 (как частичная >функция)

    ON>Неоднозначность с Y получается потому, что запятых нет. В Бейсике пищут "Find ,,0,1". Если по номеру аргумента не понятно, мужно как-то указывать имя

    ON>result = my_func y<-1
    ON>А без имен и запятых можно договориться, что за первый агрумент считать тот, что первый, тогда ясно что 1 пойдет в X, а по Y считаем либо частичную функцию либо берем значение по-умолчанию. Популярные языки либо умирают, либо "развиваются" — заимствуют друг у друга. Можно понять программистов с опытом — посмотрит на Хаскель, потыкает и делает вывод: "Не жилец". Вот если бы на Xacкель понимал исходник С++, как С++ понял обычный С, может быть что-то и вышло.

    Да на самом деле дело даже не в этом. Значения по умолчанию как в С++ конфликтуют с перегрузкой.
    int f(int x, int y = 0);
    int f(int x);
    Ну и что вызывать, если написано f(1);
    Если бы в С++ не было значений по умолчанию все было бы проще. А если уж неймется, то можно было бы их получить:
    int f(int x) { return f(x, 0); }

    Извините, за банальности.

    Так что ну их эти значения по умолчанию...
    Re[14]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 09.09.04 17:11
    Оценка: :)))
    VD>Ты вот свои минусы что-то не считашь. А тебе их точно не чтобы насолить ставят.
    Ну мне-то понятно — ставят точно не чтобы насолить. Это только тебе минусы ставят за просто так, несправедливо обижают бедного прадворуба.

    VD>Кстати, хочешь эксперемент? Вскажи все что ты тут про Шарп налепил в отдельной теме или (что еще лучше) в форуме по дотнету. Я тебе гарантирую несколько десятков минусов.

    VD>Просто этот бред обычные люди дочитать не могут. Тут остались только те кто слишком не равнодушен к ФЯ.
    Молодец, замер качественный, серьезный. Ты бы поаккуратнее, а то сдуру можно и ... сломать — меряться будет нечем
    Re[20]: Fuzzy и Call-by-callback в ФЯ?
    От: ON  
    Дата: 09.09.04 17:21
    Оценка:
    From: Nick_

    >Извините, за банальности.


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

    С рекурсией подставляющей значения хранящиеся в самой функции я тоже думал, но там нужно вводить значение nil для всех типов. А если уж оно появится придется делать все {{0,1},nil},nil}....
    Posted via RSDN NNTP Server 1.9 gamma
    Re[19]: Fuzzy и Call-by-callback в ФЯ?
    От: ON  
    Дата: 09.09.04 17:26
    Оценка:
    From: ON

    опечатку у себя заметил "по Фрейду"

    >мужно


    нужно->можно == можно->нужно

    "->" импликация
    Posted via RSDN NNTP Server 1.9 gamma
    Re[10]: Сильные стороны функционального программирования
    От: Lloyd Россия  
    Дата: 09.09.04 17:44
    Оценка: +2
    Здравствуйте, VladD2, Вы писали:

    VD>Исходите из того посыла, что если текст покажется убедительным мне, то он будет убедительным и для 80% других императивщиков.


    Абалдеть. А Вы иконы со своим ликом еще не пишете?
    ... << RSDN@Home 1.1.4 @@subversion >>
    Re[18]: Сильные стороны функционального программирования
    От: Lloyd Россия  
    Дата: 09.09.04 19:41
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Да я вот тоже думал, что центром вселенского зла не являюсь. Но глядя на твое нерное тыканье на минсу начинаю сомниваться в своих "думах".


    Да я спокоен как Мертвое море,
    в шапке-ушанке с павлиньями перьями
    (с)Машнин.


    L>>Ху из послал меня подальше? Администраторы — члены rsdn-team?


    VD>Да что-ты... послали люди. Там народ пунктик создал "удалить эту провакацию" (или что-то вроде того). А админы просто с дури выполнили требование.


    Если мне не изменяет память формулировка была другая — что-то типа "это провокация". Ну я думаю, что тебе знакомо значение этого слова.

    VD>А потом народ еще два дня искал голосование в пусорке чтобы скриншот сделать для "Колеги улыбнитесь".


    А ты-то откуда об этом знаешь? На свалке рядом с самым большим бочком сидел?

    VD>Да ответы то есть, а вот мотивы как-то так ясными и не становятся. Хотя в принципе понятно.


    Так "понятно" или "не становится"?
    ... << RSDN@Home 1.1.4 @@subversion >>
    Re[18]: Сильные стороны функционального программирования
    От: Lloyd Россия  
    Дата: 09.09.04 19:41
    Оценка: :)
    Здравствуйте, VladD2, Вы писали:

    VD>Не, ну должен же быть какой-то разумный предел несогласия. Как можно понять с чем ты там не согласен? Обычно люди как-то словами выражают несогласие по отдельным частям сообщения. А то может ты не согласен с "Нужно сфорировать нормальный документ способный привлечь к проблеме тех кто пока не видит смысла в ФЯ" или "Принципиальное решение уже принято". Не находишь?


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

    L>> Мое мнение о тебе могло сформировалось только исключительно по постам в те форумы, что я читаю. Ах да, забыл. Есть же еще профиль. Но и там вроде ничего преступного нет. Так что твое предположение неверно.


    VD>Предположение о чем?


    О непредвзятости.

    VD>Не не может же быть так, что ты видишь только мое хамство, и хамство АВК.


    Почему на может быть? Не забывай, что ты формируешь добрую треть трафика в тех форумах, что я читаю.

    VD>А хамство Gaperton становится лично для тебя невидимым?


    Факты, линки и т.д.и т.п. Не надо растекаться мыслью по древу.

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


    Можешь считать что я стараюсь отмечать только те случаи когда я сильно несогласен.

    VD>>>Re[10]: ФЯ
    Автор: Gaperton
    Дата: 20.08.04


    L>>Посмотри сообщение выше по ветке. Со стороны Gaperton-а это была совершенно нормальная реакция.


    VD>Правда? "Быляцкие манеры" раз и на всегда заткнувшие рот Larm-а — это не хамство? Как интересно! А за что же он был удостоен такой чести? Он как-то оскорбил кого-то? Да и куда ты там лазил по ветке вверх? Это было первое и последнее сообщение Larm-а в этой теме.


    "Он как-то оскорбил кого-то" — ты наверное хотел написать "его кто-то оскорбил"? Наверное да. Объясняю. Представь ситуацию, двое мальцов лет по 12 стоят на улице и отнимают деньги у второкласника? Я думаю, ты не будешь просто стоять и наблюдать за этим, а подойдешь и даш им по подзатыльнику. Или все-таки будешь стоять и смотреть, т.к. они не тебя оскорбили. Так же и здесь. Larm написал хамское по форме сообщение (отнял деньги у второкласника), за что и получил заслуженный подзатыльник. Аналогия понятна?

    VD>>>Re[10]: Сильные стороны функционального программирования
    Автор: Gaperton
    Дата: 01.09.04


    L>>Аналогично.


    VD>И здесь все ОК? И здесь ты что-то выискал вверх по ветке? Маладэс. Ай браво. Честный судья. Главное лубиш судать. Это приятно. Ну, а то что после этого хамства Glоbus так же прекратил всякое общение с Gaperton — это уже мелочи. Так?


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

    L>>Та же фигня.


    VD>Кто бы сомневался.


    Я рад, что ты понял, по какому принцыпу я ставлю минусы.

    VD>Это радует. Я вообще считаю, что самое обидное это посредственность. Ее не замечают. А такая принципиальность таки просто не может не радовать.


    и посредственность может быть принцыпиальной.

    VD>Всегда сапасибо. Приятно видеть человека честного, непредвзятого и с чистой совестью.


    Да, я такой!
    ... << RSDN@Home 1.1.4 @@subversion >>
    Re[15]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 10.09.04 03:03
    Оценка: :)
    Здравствуйте, Gaperton, Вы писали:

    G>Молодец, замер качественный, серьезный. Ты бы поаккуратнее, а то сдуру можно и ... сломать — меряться будет нечем


    Если я тебе что-то отдавил или сломал, то прошу прощения.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 10.09.04 03:03
    Оценка:
    Здравствуйте, Lloyd, Вы писали:

    VD>>Исходите из того посыла, что если текст покажется убедительным мне, то он будет убедительным и для 80% других императивщиков.


    L>Абалдеть. А Вы иконы со своим ликом еще не пишете?


    Ну, поделись своим опытом. Может и попробую.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[19]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 10.09.04 03:03
    Оценка: -3
    Здравствуйте, Gaperton, Вы писали:

    G>Повторяю для особо тупых: за высказывание


    Для себя что ли? Или думешь меня задеть?

    G>"Это похоже на завывания плюсовиков по поводу того, что в шарпе нельзя делать некоторые гадости, к которым они привыкли."


    Ясно сравнили с недостойными плюсовиками. Ну, это конечно повод чтобы человека оскорбить.

    VD>>Он как-то оскорбил кого-то?

    G>Весь город. Во-первых, он неуважительно отозвался о самом факте критики шарпов со стороны "плюсовиков".

    Может необорот? Ну, да не важно.

    G> Для тупых: смотри слово "завывания".


    Ой, нам тупым не ясно. Уж извини, переспращу. Ты вспомнил как сам завывал, или ассоциации какие-то плохие. А может просто у тебя манеры эээ.. аа... ну, ты понял?

    G> Ну а во вторых, он адресовал это Гапертону, ни за что ни про что фактически называв его слова "завываниями", а вещи о которых он рассказывает — "гадостью" (что впрочем уже мелочи).

    G>За подобный стиль общения в приличном обществе вполне можно схватить в хлебало.

    Что хватал уже? Судя по твоим выражениям должен быть. Или общества приличного не нашел?

    G> Для особо тупых, кто не понимает, что так себя вести не стоит. Но кое-кто видимо отвык от хороших манер. Субкультура, понимаешь. Это я не о Larm — одно сообщение это не система.


    Но у тебя то не одно.

    Ну, ладно. Фог с ним с Larm. Сказал правду в не очень спокойной манере. Будем считать что для тебя нормально обзывать других в таких ситуциях. А вот Glоbus-а ты зачем унизил? Развел демагогию. Перешл на личность. Доказал ему, что имешь очень доказательные аргументы?

    G>Кстати, я думаю что он не написал больше ничего по более прозаической причине — ему просто не интересно. И я это понимаю.


    А, ну, думай. Тут уже человек пять после твоих "объяснений" больше слов не нашли. В общем, ты им все очнь подробно и доказательно объяснил. Уверен вопросов больше не будет.

    VD>>И здесь все ОК? И здесь ты что-то выискал вверх по ветке? Маладэс. Ай браво. Честный судья. Главное лубиш судать. Это приятно. Ну, а то что после этого хамства Glоbus так же прекратил всякое общение с Gaperton — это уже мелочи. Так?


    G>И правильно сделал


    Да. Трудно не согласиться.

    G> — я ведь ему сказал, что "мне неинтересно с тобой общяться". И ничего кроме.


    Да, что напрягать память то. Ты погляди. Там такая банальная демагогия, что даже ребенок увидит.

    G> И не вижу, кстати, в этом никакого хамства и личной трагедии Globus-а. Я сильно удивлюсь, если он сейчас напишет, что расстроен этим фактом.


    Боюсь, что он эту ветку вообще больше читать не бедет. А может и вообще все что касаются ФЯ с твоим участием.

    G>А вообще, я очень рад. Я очень вежливый человек, если в поисках "вопиющего хамства Gaperton-а" это самое вопиющее, что тебе удалось найти.


    Победятел. Отбил у людей всякое желание с тобой общаться и рад. А сообщения, эти к сожалению далеко не плод долгой силекции. А так подмечанные между делом.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[16]: Сильные стороны функционального программирования
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 10.09.04 05:17
    Оценка: 2 (2) +6
    Здравствуйте, VladD2, Вы писали:

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


    G>>Молодец, замер качественный, серьезный. Ты бы поаккуратнее, а то сдуру можно и ... сломать — меряться будет нечем


    VD>Если я тебе что-то отдавил или сломал, то прошу прощения.


    VladD2, слушай можно нескромный вопрос — у тебя какие-то проблемы или как?
    Если честно — надоело уже читать вашу перепалку с гапертоном и лойдом читать, причём в последнее время они больше отвечают лишь на твои выпады.
    Может быть есть смысл оставить это и заняться гораздо более конструктивными вещами?

    ЗЫ Извиняюсь за интонацию, но уже конкретно достало, ибо топик был не вашей перебранке посвящён всё-таки
    Re[17]: Сильные стороны функционального программирования
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 10.09.04 05:19
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>VladD2, слушай можно нескромный вопрос — у тебя какие-то проблемы или как?

    К>Если честно — надоело уже читать вашу перепалку с гапертоном и лойдом читать, причём в последнее время они больше отвечают лишь на твои выпады.
    К>Может быть есть смысл оставить это и заняться гораздо более конструктивными вещами?

    К>ЗЫ Извиняюсь за интонацию, но уже конкретно достало, ибо топик был не вашей перебранке посвящён всё-таки


    К другим участникам тоже такой призыв, если это вам, конечно, не трудно.
    Re[18]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 10.09.04 07:33
    Оценка: :)
    Здравствуйте, Курилка, Вы писали:

    Да. Давно пора эту часть дискуссии в какие-нибудь Священные войны перенести
    Re[19]: Сильные стороны функционального программирования
    От: Курилка Россия http://kirya.narod.ru/
    Дата: 10.09.04 07:43
    Оценка: :)
    Здравствуйте, Quintanar, Вы писали:

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


    Q>Да. Давно пора эту часть дискуссии в какие-нибудь Священные войны перенести


    Священная война Vlad2 vs. (Gaperton & Lloyd) ?
    Re[20]: Сильные стороны функционального программирования
    От: INTP_mihoshi Россия  
    Дата: 10.09.04 07:54
    Оценка: 21 (2) +1
    Здравствуйте, Курилка, Вы писали:

    Q>>Да. Давно пора эту часть дискуссии в какие-нибудь Священные войны перенести


    К>Священная война Vlad2 vs. (Gaperton & Lloyd) ?


    Никода не спорьте с Владом. Люди могут не замеитить между вами разницы
    Re[21]: Fuzzy и Call-by-callback в ФЯ?
    От: naje  
    Дата: 10.09.04 08:32
    Оценка:
    Здравствуйте, ON, Вы писали:

    ON>С рекурсией подставляющей значения хранящиеся в самой функции я тоже думал, но там нужно вводить значение nil для всех типов. А если уж оно появится придется делать все {{0,1},nil},nil}....


    если мне не изменяет память, это называется flat CPO, можно погуглить и найти много интересного
    Re[24]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 10.09.04 15:38
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    Q>>Кстати, OCaml, думаю, вообще не проиграл бы в производительности, поскольку на него твою программу можно перенести 1 в 1.

    WH>Если писать императивно. Кстати напиши. И сравним производительность

    Ну зачем сразу императивно. Давай попробуем писать чиста функционально , на чиста функциональном языке Clean.

    module fsieve
    
    /*
    The Fast Sieve of Eratosthenes.
    
    A sequential and optimized version of the sieve of Eratosthenes.
    The program calculates a list of the first NrOfPrime primes.
    The result of the program is the NrOfPrimes'th prime.
    
    Strictness annotations have been added because the strictness analyser
    is not able to deduce all strictness information. Removal of these !'s
    will make the program about 20% slower.
    */
    
    import StdClass; // RWS
    import StdInt, StdReal
         
    NrOfPrimes :== 100000 
        
    //    The sieve algorithm: generate an infinite list of all primes.
    Primes::[Int]
    Primes = pr where pr = [5 : Sieve 7 4 pr]
    
    Sieve::Int !Int [Int] -> [Int]
    Sieve g i prs
        | IsPrime prs g (toInt (sqrt (toReal g)))    =  [g : Sieve` g i prs]
                                                    =  Sieve (g + i) (6 - i) prs
    
    Sieve`::Int Int [Int] -> [Int]
    Sieve` g i prs =  Sieve (g + i) (6 - i) prs
    
    IsPrime::[Int] !Int Int -> Bool
    IsPrime [f:r] pr bd | f>bd             =  True
                        | pr rem f==0    =  False
                                        =  IsPrime r pr bd
                                      
    //    Select is used to get the NrOfPrimes'th prime from the infinite list.
    Select::[x] Int -> x
    Select [f:r] 1 =  f
    Select [f:r] n =  Select r (n - 1)
    
    /*    The Start rule: Select the NrOfPrimes'th prime from the list of primes
        generated by Primes.
    */
    Start::Int
    Start = Select [2, 3 : Primes] NrOfPrimes


    А вот это скомпилированный мной .exe
    Использует ленивые вычисления. Вычисяет первые 100000 простых чисел. Печатает последнее вычисленое число.
    Пишет время выполнения, и время GC. У меня — от 0.29 до 0.31 секунды.
    Re[25]: Сильные стороны функционального программирования
    От: WolfHound  
    Дата: 10.09.04 16:48
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>А вот это скомпилированный мной .exe

    G>Использует ленивые вычисления. Вычисяет первые 100000 простых чисел. Печатает последнее вычисленое число.
    G>Пишет время выполнения, и время GC. У меня — от 0.29 до 0.31 секунды.
    Твой ехешник у меня дает примерно такоеже время.
    А это мои результаты
    last = 1299709 time = 0.0657921

    Вот сама программа. Я ее немного порефакторил.
    //Это ограничительная константа(твоя программа раньше сдохнет.)
    //На 64х битных платформах ее можно со спкойной совестью еще поднять.
    //Но у меня 32х битная машина :(
    size_t const max_number=2*1024*1024*1000;
    //Этой константой можно играться для тонкой настройки производительности алгоритма
    size_t const buf_count=4*1024*1024;
    size_t const buf_size=buf_count/CHAR_BIT;
    
    struct prime_numbers
    {
        size_t cur_number;
        size_t state;
        size_t offset;
        size_t next_offset;
        std::vector<byte> buf;
        std::vector<size_t> numbers;
    
        prime_numbers()
            :state(8)
            ,offset(0)
            ,next_offset(buf_count)
            ,buf(buf_size+100)
        {
            numbers.reserve(110*1024*1024);
        }
        bool test_number(size_t n)
        {
            if(n>=next_offset)
            {
                offset=next_offset;
                next_offset+=buf_count;
                std::fill(buf.begin(), buf.end(), 0);
                //вычеркивать начинаем с 7 ибо числа кратные 2, 3, 5 нам всеравно не попадутся :))
                for(std::vector<size_t>::const_iterator i=numbers.begin()+3, e=numbers.end();i!=e;++i)
                    remove_number(*i);
            }
            n-=offset;
            size_t pos=n/CHAR_BIT;
            size_t ofs=n%CHAR_BIT;
            return buf[pos]&(1<<ofs);
        }
        void new_number(size_t i)
        {
            numbers.push_back(i);
            remove_number(i);
        }
        void __forceinline remove_number(size_t i)
        {
            size_t m=offset%i;
            size_t n=m?i-m:0;
            for(;n<buf_count;n+=i)
            {
                size_t pos=n/CHAR_BIT;
                size_t ofs=n%CHAR_BIT;
                buf[pos]|=1<<ofs;
            }
        }
        void next()
        {
            size_t i=cur_number;
            switch(state)
            {
                case  8:    new_number(2);  state= 9;   cur_number=2;   return;
                case  9:    new_number(3);  state=10;   cur_number=3;   return;
                case 10:    new_number(5);  state=11;   cur_number=5;   return;
                case 11:    i=1;
                case 0:
                for(;i<max_number;)
                {
                        i+=6;   if(!test_number(i)) {new_number(i); state=1;    cur_number=i;   return;}
                case 1: i+=4;   if(!test_number(i)) {new_number(i); state=2;    cur_number=i;   return;}
                case 2: i+=2;   if(!test_number(i)) {new_number(i); state=3;    cur_number=i;   return;}
                case 3: i+=4;   if(!test_number(i)) {new_number(i); state=4;    cur_number=i;   return;}
                case 4: i+=2;   if(!test_number(i)) {new_number(i); state=5;    cur_number=i;   return;}
                case 5: i+=4;   if(!test_number(i)) {new_number(i); state=6;    cur_number=i;   return;}
                case 6: i+=6;   if(!test_number(i)) {new_number(i); state=7;    cur_number=i;   return;}
                case 7: i+=2;   if(!test_number(i)) {new_number(i); state=0;    cur_number=i;   return;}
                }
                state=12;
                case 12:;
            }
        }
        bool is_end()const
        {
            return state==12;
        }
        size_t cur()const
        {
            return cur_number;
        }
    };
    int main()
    {
        prime_numbers numbers;
        timer.reset();
        for(size_t i=0;i<100000;++i)
        //for(;;)
        {
            numbers.next();
            if(numbers.is_end())
                break;
            //on_prime_number_print(numbers.cur());
        }
        std::cout<<"last = "<<numbers.cur()<<" time = "<<timer.time()<<std::endl;
        return 0;
    }


    ЗЫ А что будет с твоей программой если задать такой 10000000 лимит?
    last = 179424673 time = 7.35434
    ... << RSDN@Home 1.1.4 rev. 142 >>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[26]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 10.09.04 17:15
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>ЗЫ А что будет с твоей программой если задать такой 10000000 лимит?

    WH>last = 179424673 time = 7.35434
    WH>

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

    Сделаю — напишу Надеюсь сократить проигрыш минимум до 1.5-2х раз (в худшем случае).
    Справка: пока моя прога медленнее в 4.5 раза
    Re[27]: Сильные стороны функционального программирования
    От: WolfHound  
    Дата: 10.09.04 18:54
    Оценка: +1
    Здравствуйте, Gaperton, Вы писали:

    G>Ну раз пошла такая пьянка, то мне тоже надо немного порефакторить.

    G>А именно, отключить ленивые вычисления,
    Дык я какраз их и вводил
    G>сохранив итеративный рассчет. Т. е. как это и сделано у тебя.
    Это не от хорошей жизни. В исходной
    Автор: WolfHound
    Дата: 23.06.04
    программе этого небыло.

    А это
    Автор: WolfHound
    Дата: 23.06.04
    вобще базовый алгоритм.

    G>Сделаю — напишу Надеюсь сократить проигрыш минимум до 1.5-2х раз (в худшем случае).

    G>Справка: пока моя прога медленнее в 4.5 раза
    На ста тысячах. А ты на 10 миллионах запусти.
    ... << RSDN@Home 1.1.4 rev. 142 >>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[17]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 10.09.04 18:58
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>VladD2, слушай можно нескромный вопрос — у тебя какие-то проблемы или как?


    О... Множество. Вот процессор никак достать не могу.

    К>Если честно — надоело уже читать вашу перепалку с гапертоном и лойдом читать, причём в последнее время они больше отвечают лишь на твои выпады.


    Дык не читай.

    К>Может быть есть смысл оставить это и заняться гораздо более конструктивными вещами?


    Я это предлагал уже несколько раз. Даже вроде взялись за статьи. Но пока что они недоделаны. Я даже переспросил не нужна ли помощь. Может в интерактиве попробовать... Но видимо интереснее флэйимить...

    К>ЗЫ Извиняюсь за интонацию, но уже конкретно достало, ибо топик был не вашей перебранке посвящён всё-таки


    Да все в норме. Извиняться, лично тебе незачто.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[20]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 10.09.04 18:58
    Оценка: -1 :)
    Здравствуйте, Курилка, Вы писали:

    К>Священная война Vlad2 vs. (Gaperton & Lloyd) ?


    Не лучше так VladD2 vs. все прогрессивное человечество.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[21]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 10.09.04 18:58
    Оценка: -1
    Здравствуйте, INTP_mihoshi, Вы писали:

    INT>Никода не спорьте с Владом. Люди могут не замеитить между вами разницы


    И не подначивайте его. А то люди могут не заметить и всего остального.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 11.09.04 03:25
    Оценка:
    Здравствуйте, Курилка, Вы писали:

    К>Т.е. для каждой такой заплатки ждём новую версию? Тебе нравится такое решение подобных проблем?


    Нет. Поэтому мы и делаем R#. Где такие "заплатки" можно будет делать самому.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[27]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 11.09.04 03:25
    Оценка: :)
    Здравствуйте, Gaperton, Вы писали:

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


    Далее остается отключить функциональный стиль ивсе будет в пордяке.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[28]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 11.09.04 07:06
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


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


    VD>Далее остается отключить функциональный стиль ивсе будет в пордяке.



    Чем непонятнее программа, тем она императивнее, но и быстрее. Что нужнее каждый выбирает сам. Сейчас скорость далеко не самая важная составляющая.
    Re[29]: Сильные стороны функционального программирования
    От: INTP_mihoshi Россия  
    Дата: 11.09.04 11:38
    Оценка: +1
    Здравствуйте, Quintanar, Вы писали:

    Q>Чем непонятнее программа, тем она императивнее, но и быстрее. Что нужнее каждый выбирает сам. Сейчас скорость далеко не самая важная составляющая.


    Чем более программа оптимизирована, тем она непонятнее, но и быстрее.

    Императивность здесь абсолютно нипричем. Кроме того, что обычно императивный код позаоляет точнее управлять конечной машиной.
    Re[30]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 11.09.04 12:39
    Оценка: +1 -1
    Здравствуйте, INTP_mihoshi, Вы писали:

    INT> обычно императивный код позаоляет точнее управлять конечной машиной.


    Поэтому и причем. Оптимизации связаны, как правило, с "императивнизацией" некоторых частей программы.
    Re[29]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 11.09.04 20:20
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    Q>Чем непонятнее программа, тем она императивнее, но и быстрее. Что нужнее каждый выбирает сам. Сейчас скорость далеко не самая важная составляющая.


    Довольно странно говорить эти слова после демонстрации нечитаемости функционального стиля приведенной выше.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[31]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 11.09.04 20:20
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

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


    INT>> обычно императивный код позаоляет точнее управлять конечной машиной.


    Q>Поэтому и причем. Оптимизации связаны, как правило, с "императивнизацией" некоторых частей программы.


    Тут уже приводился пример быстрой сортировки разпухший на глазах от мелкой оптимизации. Почему-то императивщины там небыло вовсе. Это как-то объясняется?
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[30]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 11.09.04 22:06
    Оценка: 1 (1) +3
    Здравствуйте, VladD2, Вы писали:

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


    Q>>Чем непонятнее программа, тем она императивнее, но и быстрее. Что нужнее каждый выбирает сам. Сейчас скорость далеко не самая важная составляющая.


    VD>Довольно странно говорить эти слова после демонстрации нечитаемости функционального стиля приведенной выше.


    Чего там непонятного-то? Любой человек, знающий хоть один функциональный язык программирования, легко поймет, что делает программа. Я Clean не знаю, но все понял.
    Тебе запись кажется малопонятной, поскольку ты просто не знаешь, что к чему — интиуиция наработанная на использовании императивных языков здесь не поможет.
    Re[12]: Сильные стороны функционального программирования
    От: Lloyd Россия  
    Дата: 12.09.04 11:49
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    L>>Абалдеть. А Вы иконы со своим ликом еще не пишете?


    VD>Ну, поделись своим опытом. Может и попробую.


    У меня нет такого опыта.
    ... << RSDN@Home 1.1.4 @@subversion >>
    Re[28]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 12.09.04 17:59
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


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


    VD>Далее остается отключить функциональный стиль ивсе будет в пордяке.

    В Clean нельзя отключить функциональный стиль. Но все равно все будет в порядке.
    Re[28]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 12.09.04 18:16
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

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


    G>>Ну раз пошла такая пьянка, то мне тоже надо немного порефакторить.

    G>>А именно, отключить ленивые вычисления,
    WH>Дык я какраз их и вводил
    Ни одного ленивого вызова у тебя в программе нет. Приколись? Ты их вводил-вводил, но так и не ввел. Ты ввел итеративный рассчет. А у меня они в проге есть. Их я и собираюсь убрать.

    G>>сохранив итеративный рассчет. Т. е. как это и сделано у тебя.

    WH>Это не от хорошей жизни. В исходной
    Автор: WolfHound
    Дата: 23.06.04
    программе этого небыло.

    А почему жизнь настолько плоха? В чем причина? Неужели в том, что Haskell и Clean оказались шустрее, чем должны?

    WH>А это
    Автор: WolfHound
    Дата: 23.06.04
    вобще базовый алгоритм.


    G>>Сделаю — напишу Надеюсь сократить проигрыш минимум до 1.5-2х раз (в худшем случае).

    G>>Справка: пока моя прога медленнее в 4.5 раза
    WH>На ста тысячах. А ты на 10 миллионах запусти.
    А зачем? Мой алгоритм имеет асимптотику O(N*sqrt(N)). И время будет расти соответственно. Судя по твоим замерам, ты просто используешь другой алгоритм. Сравнение теряет смысл, если мы не будем использовать одинаковый алгоритм. При одинаковых алгоритмах коэффициент плавать не будет.

    Если конечно, речь не идет об очередном втыкании рога в землю на тему "х.. догонишь". Замечу, что у тебя полнее контроль над машиной, и пока ты еще не пользовался ассемблерными вставками и набором инструкций SSE2. Так что резерв для рывка есть.
    Re[27]: Особенности компилятора Clean
    От: Gaperton http://gaperton.livejournal.com
    Дата: 13.09.04 12:26
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

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

    На ленивом вызове в проге потери никакой нет. Соответственно, убирать его не надо. Это я стормозил — мог бы и сразу додуматься. Потому как 98% времени тратится на проверку IsPrime. А именно, на сканирование списка уже построеных простых чисел.

    А вот самое интересное в том, что пробежаться по массиву, как выяснилось, это чуть медленнее, чем по списку . Прикол, однако. Так что оптимизировать дальше не получится. Вот такие дела.

    Так что, Wolfhound, можешь праздновать победу!
    Ну, пока кто-нибудь не сделал пример на OCaml (или на Sisal, чего мы вряд-ли дождемся).
    Re[28]: Особенности компилятора OCaml
    От: INTP_mihoshi Россия  
    Дата: 13.09.04 14:01
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Так что, Wolfhound, можешь праздновать победу!

    G>Ну, пока кто-нибудь не сделал пример на OCaml (или на Sisal, чего мы вряд-ли дождемся).

    Просто я так и не понял "условий игры". Что нужно вывести, за какое время и насколько можно оптимизировать. И, кстати, какого размера должна быть программа.

    Вобщем, предлагаю такой вариант. Я пишу на OCaml программу, с количеством _слов_ меньше, чем у Wolfhound и более быструю, хотя и не чисто ФО. В "Эратосфене" достаточно места для высокоуровневой оптимизации, соответственно Ocamlу есть где развернуться.

    Если интересно, давайте точные условия.
    Re[29]: Особенности компилятора OCaml
    От: Gaperton http://gaperton.livejournal.com
    Дата: 13.09.04 15:01
    Оценка:
    Здравствуйте, INTP_mihoshi, Вы писали:

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


    G>>Так что, Wolfhound, можешь праздновать победу!

    G>>Ну, пока кто-нибудь не сделал пример на OCaml (или на Sisal, чего мы вряд-ли дождемся).

    INT>Просто я так и не понял "условий игры". Что нужно вывести, за какое время и насколько можно оптимизировать. И, кстати, какого размера должна быть программа.


    INT>Вобщем, предлагаю такой вариант. Я пишу на OCaml программу, с количеством _слов_ меньше, чем у Wolfhound и более быструю, хотя и не чисто ФО. В "Эратосфене" достаточно места для высокоуровневой оптимизации, соответственно Ocamlу есть где развернуться.


    INT>Если интересно, давайте точные условия.

    Может тему новую откроем? Конкурс на самую быструю реализацию решета эратосфена .

    Мне было-бы интересно сравнить эффективность компиляторов на одном алгоритме, с одинаковой асимптотикой.
    Но Wolfhound занялся алгоритмической оптимизацией, что затрудняет такое сравнение. Если хочется с ним посоревноваться — welcome.
    Re[31]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.09.04 20:19
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

    Q>Чего там непонятного-то? Любой человек, знающий хоть один функциональный язык программирования, легко поймет, что делает программа.


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

    Q>Тебе запись кажется малопонятной, поскольку ты просто не знаешь, что к чему — интиуиция наработанная на использовании императивных языков здесь не поможет.


    Я говорю о интуиции наработанной вообще без знания каких бы то нибыло языков программирования.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[29]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 15.09.04 20:19
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    VD>>Далее остается отключить функциональный стиль ивсе будет в пордяке.

    G>В Clean нельзя отключить функциональный стиль. Но все равно все будет в порядке.

    Юмор нужно прокачивать...
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[32]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 16.09.04 10:23
    Оценка: 1 (1) +2
    Здравствуйте, VladD2, Вы писали:

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


    И что? Множества любой человек и любой человек, знающий хотя бы один императивный язык программирования пересекаются тоже не слишком значительно.

    VD>Я говорю о интуиции наработанной вообще без знания каких бы то нибыло языков программирования.


    Это демагогия. Интуитивно можно только кувалдой по шпалам дубасить, если речь идет о чем-то более сложном, нужно обучение.
    Большинство людей в мире вообще не способны программировать даже на ИЯ, которые тут некоторые причислили к интуитивно понятным, в тоже время они прекрасно справляются с не менее сложными задачами, которые программисты своими программами решить не способны, — водят машину, например.
    Re[30]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 16.09.04 10:36
    Оценка: 1 (1) +2
    Здравствуйте, VladD2, Вы писали:

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


    VD>>>Далее остается отключить функциональный стиль ивсе будет в пордяке.

    G>>В Clean нельзя отключить функциональный стиль. Но все равно все будет в порядке.

    VD>Юмор нужно прокачивать...

    Чтобы облегчить эту задачу предлагаю ввести специальный тэг — [humor]. Иногда тяжело, знаешь ли, прокачать, без ключевого слова "лопата". А так — шутники могли бы пользоваться этим тэгом, и никаких непоняток .
    Re[33]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.09.04 22:04
    Оценка: -2
    Здравствуйте, Quintanar, Вы писали:

    Q>И что? Множества любой человек и любой человек, знающий хотя бы один императивный язык программирования пересекаются тоже не слишком значительно.


    И тем неменее императивная запись придложенная рядом будет понятна большинству "не посвященных". Что нельзя сказать о функциональной. То есть на лицо явная не интуитивность записи. Не факт, что это проблема подхода. Но все же.

    VD>>Я говорю о интуиции наработанной вообще без знания каких бы то нибыло языков программирования.


    Q>Это демагогия.


    Демагогией тут как раз явлются заявления о демагогии. Так что не надо.

    Q> Интуитивно можно только кувалдой по шпалам дубасить,


    Вот это заявление чистейшей воды проявление демагогии. Такой, знаете ли, яркий образ без млалейшего лаогической связи с делом.

    Q> если речь идет о чем-то более сложном, нужно обучение.


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

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

    Q>Большинство людей в мире вообще не способны программировать даже на ИЯ, которые тут некоторые причислили к интуитивно понятным,


    Пример приведен довольно четкий. Результат тоже. Зачем домысливать? Возможно освоение императивного подхода и не просто. Но функционального еще сложнее. Если бы это было не так, то и расклад сил был бы совсем другим.

    Q> в тоже время они прекрасно справляются с не менее сложными задачами, которые программисты своими программами решить не способны, — водят машину, например.


    Вот это уж безусловно демагогия. ФЯ точно до вождения машин еще не дошло. Так что... Ну, да я так понимаю тут вообещ главное "одогреть своих". Вот только кому это нужно?
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[31]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 16.09.04 22:04
    Оценка: -1
    Здравствуйте, Gaperton, Вы писали:

    G>Чтобы облегчить эту задачу предлагаю ввести специальный тэг — [humor]. Иногда тяжело, знаешь ли, прокачать, без ключевого слова "лопата". А так — шутники могли бы пользоваться этим тэгом, и никаких непоняток .


    Мне кажется такая примитивизация нужна не многим. Уж лучше пусть каждый сам развивает свой юмор. Для этого даже отедьный форум есть. На крайняк есть "".
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[32]: Сильные стороны функционального программирования
    От: Gaperton http://gaperton.livejournal.com
    Дата: 17.09.04 13:12
    Оценка: +1 :))) :))
    Здравствуйте, VladD2, Вы писали:

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

    Эх ты, императивщик. Юмор не прокачал?

    [humor]
    G>>Чтобы облегчить эту задачу предлагаю ввести специальный тэг — [humor]. Иногда тяжело, знаешь ли, прокачать, без ключевого слова "лопата". А так — шутники могли бы пользоваться этим тэгом, и никаких непоняток .
    [/humor]

    Рекурсивное определение, типичное для функциональных языков
    Re[34]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 17.09.04 13:53
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>И тем неменее императивная запись придложенная рядом будет понятна большинству "не посвященных". Что нельзя сказать о функциональной. То есть на лицо явная не интуитивность записи. Не факт, что это проблема подхода. Но все же.


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


    VD>Обучение обучением. Но если простой человек не может за месяц въехать в базовые понятия, значит система переусложена.


    Не понимаю о чем ты говоришь. В основы любого ФЯ можно легко въехать за неделю неторопливого изучения, если человек уже знает один подобный язык, срок, естественно, сокращается. Количество новых для императивщика понятий невелико — рекурсия вместо циклов, иная система типов, pattern-matching (понятен интуитивно) и еще может быть чуть-чуть.

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


    Способ программирования на ФЯ близок к записи математических утверждений. Никто особо не жалуется на неинтуитивность математической записи. Просто одни люди способны ее воспринимать, другие нет. Для гуманитария с филологического факультета и императивный и функциональный стили одинаково интуитивно непонятны.
    Re[35]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 17.09.04 15:40
    Оценка:
    Здравствуйте, Quintanar, Вы писали:

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


    Сслыка была тут рядом. Читай внимательнее.

    VD>>Обучение обучением. Но если простой человек не может за месяц въехать в базовые понятия, значит система переусложена.


    Q>Не понимаю о чем ты говоришь.


    Веренее делашь вид, что не понимаешь.

    Q> В основы любого ФЯ можно легко въехать за неделю неторопливого изучения, если человек уже знает один подобный язык,


    Т.е. если он уже "словам голову". А если нет?

    Q> срок, естественно, сокращается. Количество новых для императивщика понятий невелико — рекурсия вместо циклов, иная система типов, pattern-matching (понятен интуитивно) и еще может быть чуть-чуть.


    И тем не менее изучение "первого" ФЯ крайне не простая задача.

    Q>Способ программирования на ФЯ близок к записи математических утверждений.


    Но они сами по себе долек от записи к которым привыкли люди долекие от математики.

    Q> Никто особо не жалуется на неинтуитивность математической записи.


    Да жалуются. Более того есть четкая обратная зависимость от количества мат. формул в статье и ее понятности и доступносте.

    Q> Просто одни люди способны ее воспринимать, другие нет.


    Да почти все способны если их как следует надресировать.

    Q> Для гуманитария с филологического факультета и императивный и функциональный стили одинаково интуитивно непонятны.


    И все же императивный стиль проще для восприятия. Причем мне кажется дело тут не функциональном подходе, а в конкретном синтаксисе. Ведь есть примеры специализированных языков с функциональным уклоном легко осваеваемых даже не программистами (SQL, XPath, XSLT).
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[36]: Сильные стороны функционального программирования
    От: Quintanar Россия  
    Дата: 17.09.04 16:52
    Оценка: +1 -1
    Здравствуйте, VladD2, Вы писали:

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


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


    VD>Сслыка была тут рядом. Читай внимательнее.


    Я не нашел ее. Приведи ее здесь.

    Q>> В основы любого ФЯ можно легко въехать за неделю неторопливого изучения, если человек уже знает один подобный язык,


    VD>Т.е. если он уже "словам голову". А если нет?


    Не надо искажать мои слова. Если человек не знает ФП, то изучит за неделю, если уже знаком, то за пару дней. Я в свое время научился разбираться в программах на SML именно за такой срок.

    VD>И тем не менее изучение "первого" ФЯ крайне не простая задача.


    Это не так. В строгих ФЯ (SML, OCaml, MoscowML) нет абсолютно ничего сложного. Особняком здесь, может быть, стоит Haskell, сначала лучше изучать очень простой SML. У O'Caml раньше была очень плохая документация и сам он переусложнен многими нечасто используемыми фичами типа объектов, но сейчас есть книга, где все достаточно грамотно и просто рассказано.

    VD>И все же императивный стиль проще для восприятия. Причем мне кажется дело тут не функциональном подходе, а в конкретном синтаксисе. Ведь есть примеры специализированных языков с функциональным уклоном легко осваеваемых даже не программистами (SQL, XPath, XSLT).


    У всех ФЯ одной группы очень похожий синтаксис (Scheme, Lisp и Haskell, SML, OCaml) как и у императивных языков (C++, Java, C#), другого просто нет. Шаблоны в С++ тоже примитивный ФЯ, так они гораздо непонятнее любого из вышеприведенных ФЯ.
    Re[33]: Сильные стороны функционального программирования
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 17.09.04 20:03
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

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


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

    G>Эх ты, императивщик. Юмор не прокачал?

    Видимо он был каким-то не таким... каким-то функциональным.

    G>[humor]

    G>>>Чтобы облегчить эту задачу предлагаю ввести специальный тэг — [humor]. Иногда тяжело, знаешь ли, прокачать, без ключевого слова "лопата". А так — шутники могли бы пользоваться этим тэгом, и никаких непоняток .
    G>[/humor]

    G>Рекурсивное определение, типичное для функциональных языков


    Видимо ФЯ накладывает свой отпечаток на образе мышления.
    ... << RSDN@Home 1.1.4 beta 2 >>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[36]: Сильные стороны функционального программирования
    От: Nick_ Россия  
    Дата: 18.09.04 18:16
    Оценка: -2 :))
    VD>И все же императивный стиль проще для восприятия. Причем мне кажется дело тут не функциональном подходе, а в конкретном синтаксисе. Ведь есть примеры специализированных языков с функциональным уклоном легко осваеваемых даже не программистами (SQL, XPath, XSLT).

    Ну и возитесь дальше с императивным стилем.

    Дейкстра в свое время писал: "the goto statement should be treated on equal syntactic footing with the assignment statement."
    Так что вы мне напоминаете человека, который орет, что goto это круто.
    Re[17]: Fuzzy и Call-by-callback в ФЯ?
    От: Quintanar Россия  
    Дата: 20.09.04 09:17
    Оценка:
    Здравствуйте, ON, Вы писали:

    ON>Совсем замечательно было бы, если бы лямбда, куда подставляем пакет, могла заказать у этого пакета переменную некоторого типа, то есть даем пакету тип и получаем такую переменную если там есть такая. Такое вообще, бывает? Какой-нибудь Call-by-callback?


    Оказывается, в Haskell'е можно работать с динамическими типами. Для этого там есть тип данных Dynamic. В него можно положить значение, а потом достать. Вот, например:

    dl = [toDyn "aaa", toDyn 'a', toDyn (10::Int), toDyn ((\x->x)::(Int->Int))]
    
    as::(Typeable a)=>Dynamic->a->Maybe a
    as v t = fromDynamic v
    
    tChar::Char
    tChar = undefined
    
    tInt::Int
    tInt = undefined
    
    tString::String
    tString = undefined
    
    getVals (x:xs) _type =
     case (x `as` _type) of 
      Nothing -> getVals xs _type
      Just x -> x:(getVals xs _type)
    getVals [] _type = []
    
    main = putStrLn ("Strings:"++(show (getVals dl tString))++"\nInts:"++(show (getVals dl tInt))
     ++"\nChars:"++(show (getVals dl tChar))


    Я создаю сначала список со значениями разных типов, а потом их достаю обратно. as по смыслу работает, как в C#, только возвращает Nothing в случае неудачи. Переменная t в его определении нужна для того, чтобы компилятор правильно определил тип возвращаемого значения.
    Re[30]: Особенности компилятора OCaml
    От: FR  
    Дата: 24.09.04 13:49
    Оценка: 1 (1)
    Здравствуйте, Gaperton, Вы писали:


    G>Мне было-бы интересно сравнить эффективность компиляторов на одном алгоритме, с одинаковой асимптотикой.


    Вот тут есть такое, и алгоритмов много и языков прилично:

    http://www.bagley.org/~doug/shootout/index3.shtml

    правда судя по версиям трансляторов чуть устарело.


    А по Эратосфену тесты есть тут:
    http://www.bagley.org/~doug/shootout/bench/sieve/
    и тут:
    http://groups.google.com/groups?oi=djq&amp;ic=1&amp;selm=an_571405096 (говорят ocaml шустрее си)
    Re[11]: Разница есть
    От: LCR Россия lj://_lcr_
    Дата: 01.10.04 05:01
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

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


    _O_>>Конечные автоматы нет нужды писать на С/C++. Проще писать на чем-то более подходящем (например на SDL), а затем генерить C(или C++) код. Получается эффективней.

    G>Знаю. Только известные мне SDL тулзы очень дорогие (кинь ссылки, если знаешь халяву, плз). Но в любом случае, иногда приходится делать КА и руками.

    Не очень понятно, в чём трудность реализации КА на C/C++/Java:
    void transite (Event e)
    {
      int old_state = state;
      switch(state)
      {
      case WAITING:
        a1.transite(e);
        a2.transite(e);
        action1();
        action2();
        if (e==Event.TICK)
        {
          // действие на переходе
          action3();
          state LISTENING:
        }
        else if (...)
        ...
      case LISTENING:
        ... 
        ну и дальше в таком же духе
        ...
      }
    }


    Да и вообще на www.softcraft.ru всё нормально написано.
    quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
    Re[12]: Разница есть
    От: Gaperton http://gaperton.livejournal.com
    Дата: 05.10.04 16:57
    Оценка:
    Здравствуйте, LCR, Вы писали:

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


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


    _O_>>>Конечные автоматы нет нужды писать на С/C++. Проще писать на чем-то более подходящем (например на SDL), а затем генерить C(или C++) код. Получается эффективней.

    G>>Знаю. Только известные мне SDL тулзы очень дорогие (кинь ссылки, если знаешь халяву, плз). Но в любом случае, иногда приходится делать КА и руками.

    LCR>Не очень понятно, в чём трудность реализации КА на C/C++/Java:

    В целом трудности конечно нет. Но в твоем примере все переменные состояния будут свалены в кучу. При сложном КА это некрасиво и нехорошо, особенно учитывая, что в каждом состоянии своя логика и свои переменные состояния. Более правильно завести по классу на каждое состояние, чтобы избавиться от switch и воспользоваться "родным" полиморфизмом Java. Здесь ФЯ выигрывает благодаря более развитому полиморфизму.
    Re[13]: Разница есть
    От: LCR Россия lj://_lcr_
    Дата: 06.10.04 10:25
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    LCR>>Не очень понятно, в чём трудность реализации КА на C/C++/Java:

    G>В целом трудности конечно нет. Но в твоем примере все переменные состояния будут свалены в кучу. При сложном КА это некрасиво и нехорошо, особенно учитывая, что в каждом состоянии своя логика и свои переменные состояния. Более правильно завести по классу на каждое состояние, чтобы избавиться от switch и воспользоваться "родным" полиморфизмом Java. Здесь ФЯ выигрывает благодаря более развитому полиморфизму.

    Так, вот с этого места поподробнее, если можно...

    Если в каждом состоянии потребуется своя логика и свои переменные состояния, то это легко добиться использовав паттерн State, все состояния — это объекты класса, производного от класса State, в самом простом случае таком:

    abstract class State
    {
        public abstract State transite(Event event);
    }


    производные классы переопределяют метод iteration нужным содержимым. Ну и классы-автоматы просто делают полиморфный вызов
        state = state.transite(Event);

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

    Какой принципиальный плюс мы получим, если решим использовать функциональный язык здесь?
    quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
    Re[14]: Разница есть
    От: Gaperton http://gaperton.livejournal.com
    Дата: 19.10.04 03:14
    Оценка:
    Здравствуйте, LCR, Вы писали:

    Удалено избыточное цитирование.

    LCR>Так, вот с этого места поподробнее, если можно...


    LCR>Если в каждом состоянии потребуется своя логика и свои переменные состояния, то это легко добиться использовав паттерн State, все состояния — это объекты класса, производного от класса State, в самом простом случае таком:

    Знаю, делал.

    LCR>Какой принципиальный плюс мы получим, если решим использовать функциональный язык здесь?


    Плюс очень простой — красота и лаконичность. Для кого-то, впрочем, это не принципиальный плюс.

    Для того, чтобы вызов функции был полиморфным, нет необходимости определять новый тип (класс), или интерфейс. Потому, что при диспетчеризации вызова кроме типов принимаются во внимание еще и значения величин. В результате, грамотная реализация КА в ФЯ прямолинейна, проста, компактна и красива, для этого совсем не надо изобретать никаких паттернов.

    Почитай ветку выше. Примеры здесь http://www.rsdn.ru/Forum/Message.aspx?mid=783732&amp;only=1
    Автор: Gaperton
    Дата: 29.08.04
    Re[15]: Разница есть
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 24.10.04 00:07
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    Большая просьба, цитировать только то на что овечашь.
    ... << RSDN@Home 1.1.4 beta 3 rev. 207>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.