![]() |
Модераторы: LSD |
![]() ![]() ![]() |
|
||
|
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
Lazin, я тольк что предложил алгоритм, вот его и напиши на ФЯ
|
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
если ты это имел ввиду то он будет выглядеть так-же, да и не серьезно это как-то) я имел ввиду что-то более серьезное, например реализовать какой-нибудь алгоритм на графе, поиск кратчайшего пути например то, что на haskell/ocaml/erlang нет смысла писать системные приложения это всем и так понятно |
|||
|
||||
Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
Сейчас тебе справедливо выскажут, что кратчайший путь в графе тоже не тянет на пример серьёзной задачи ![]() А почему, собственно, нет. Haskell — неплохой императивный язык ![]() GoldFinch, у меня нет GHC на Windows, так что код я не проверял и вполне мог не всё понять правильно из MSDN, но для иллюстрации пойдёт (здесь с подсветкой):
Если всерьёз понадобится много тягать внешние структуры из Haskell, можно соорудить библиотечку EDSL, сделать deriving Storable на Template Haskell и т.д. Предлагаю реализовать на чём угодно вторую задачу из конкурса дельфистов, на многопоточное программирование. Визуализацию можно консольную, но с GUI будет идеально. С меня решение на Haskell. Холивар? ![]() Это сообщение отредактировал(а) Void - 27.3.2009, 20:00 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
||||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
||||
|
||||
Void |
|
||||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
Просто реализовать описанное асинхронное поведение. Вот это условие:
мы переформулируем, чтобы не заострять внимание на деталях реализации:
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||||
|
|||||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
то-есть они не должны как-то оптимизировать свое поведение, что-бы увеличить шанс успеха?
|
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
Lazin, нет, задачка чисто техническая. В оригинале предлагалось минимизировать блокировки, ну а нам надо бы показать, что есть весёлого в ФЯ на тему параллелизма
![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
Придётся первому, значит
![]() Сразу решил делать что-то вроде актёров: два потока, хулиган и дворник, отсылают через асинхронную очередь сообщения третьему, который хранит состояние поля и обновляет его в соответствии с полученными данными. Очередь на основе STM уже в стандартной библиотеке. Актёр крутится в бесконечном цикле, при этом его состояние хранится в монаде State. Визуализацию сделал на Gtk2Hs и Cairo. Скриншот в аттаче. Поскольку GTK не потокобезопасен, получилось четыре потока: добавился главный поток GUI, в контексте которого можно выполнить действие с помощью библиотечной функции postGUIAsync. Не могу сказать, что код получился прям верх элегантности, но было интересно. Тестировал на Linux с GHC 6.10.1 и Gtk2Hs 0.10.0. На 6.8.* не скомпилируется из-за изменений в системе исключений, а с 6.10 работает Gtk2Hs не ранее 0.10, так что свободы выбора особо нет. Собирать с -threaded, конечно же. с подсветкой
Это сообщение отредактировал(а) Void - 2.4.2009, 00:27 Присоединённый файл ( Кол-во скачиваний: 21 ) ![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Unlocker |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 2.11.2007 Где: Москва - Знаменск (Капустин Яр) Репутация: нет Всего: 2 |
Прошу не считать меня невеждой, но в обсуждении я так и не нашел хотя бы краткого перечня задач, для которого программирование на функциональных языках будет по каким-то причинам предпочтительнее, чем на традиционных.
Я ни разу не писал код на Haskell или Ocaml (использовал Python одно время для инженерных расчетов), но из обсуждения непонятно есть ли перспектива изучения подобных языков и в каких областях. Как коррелируется изучение этого класса ЯП с применением в различных практических областях? Прошу внести ясность, если кто-то может. Это сообщение отредактировал(а) Unlocker - 2.4.2009, 09:56 --------------------
"Если бы Шекспир был программистом, то фразу "To be or not to be" он написал бы так: 2b | ! 2b." |
|||
|
||||
Rickert |
|
|||
![]() Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Будущее за классикой, ибо она - золотая середина вся.
-------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 11 Всего: 173 |
Unlocker, во-первых, не обязательно противопоставлять ФП привычному структурному и ОО-подходу. Они вполне могут сочетаться, и тому есть хорошие примеры: F#, Scala.
Трудно сразу показать на практическом примере преимущества ФП. Обычно следуют такие возражения: 1. Это непонятно. Пусть при императивном подходе будет больше кода, но я его быстрее напишу и другие быстрее поймут. 2. Как следствие из предыдущего: где найти программистов, которые будут это поддерживать и кто мне позволит использовать ФЯ на работе? 3. Это неэффективно и будет тормозить. 4. Для ФЯ нет инфраструктуры: библиотек и сред разработки. Всё это в какой-то мере справедливо. Глупо выдавать ФП за серебряную пулю, но перечисленного недостаточно, чтобы закрыть на него глаза. ФП, как и любое новшество, требует времени на обучение. Нет никаких доказательств того, что ФП фундаментально сложнее. Напротив, оно ориентировано на работу от базовых принципов, а не перечисление неформальных особенностей поведения. ФП благосклонно к более формальному подходу, но отнюдь не требует зубодробительной математики. Неоднократно слышал, как программист, поставленный перед необходимостью использования ФЯ на работе (да, бывает и такое), в минимальные сроки разбирался и начинал писать код — не больше проблем, чем с очередным фреймворком (пруфлинк, первый попавшийся). Гибридные языки вроде F# позволяют сохранить привычную компонентную структуру на высоком уровне и в то же время получить в распоряжение набор новых инструментов для создания программной логики уровнем ниже. Возьму на себя смелость утверждать, что подход, основанный на композиции чистых функций над неизменяемыми структурами данных, проще, легче поддерживается и менее подвержен ошибкам. Тем, кто работает на платформе .NET, однозначно надо попробовать F#. Microsoft тянет его в мейнстрим и одновременно обогащает C# ФП-возможностями. Заодно отпадает вопрос об IDE и библиотеках. Другое направление, в виде Haskell, стремится развить как можно более строгую систему типов со статическими проверками. Здесь сложнее обещать немедленный эффект, но на мой взгляд стоит хотя бы попробовать, что такое отделение чистых функций на уровне типов, классы типов, всеобщая ленивость и т.д. Задачку никто больше решать не будет? Erlang бы взял кто-нибудь, хоть с консолью, хоть с gs. А код на Haskell комментировать? Хотя бы в духе «это хуже чем Perl» :-) -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
||||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 4 Всего: 154 |
написал то-же самое на с++, но без GUI, все выводится в консоль, всего есть 3 потока, один для хулигана, один для дворника и основной поток, первые два потока отправляют основному потоку свое состояние через очередь(порт завершения), основной поток выступает в роли брокера, и вычисляет общее состояние
300 строк, почти в 2 раза больше чем у Void Добавлено через 3 минуты и 55 секунд ps winsows only |
|||
|
||||
GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: нет Всего: 26 |
не очень понятна фраза "Дворник бегает от края до края поля за раз сметая 3 бумажки (очищая 3 соседние ячейки) в течении 400мс."
|
|||
|
||||
![]() ![]() ![]() |
Правила ведения Религиозных войн | |
|
1. Уважайте собеседника 2. Собеседник != враг 3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez" С уважением, Smartov. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Религиозные войны | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |