вопрос функциональщикам
От: ironwit Украина  
Дата: 18.09.07 11:39
Оценка:
Читаю тут книгу по хаскелю. соответственно все новое пытаюсь сразу наложить на нужную мне задачу. Задача такова:
коммуникационный сервер, с какой то периодичностью по очереди по одному сом порту читает два прибора.
прочитанную информацию с этих приборов нужно к примеру записать в файл с меткой времени когда мы прочитали.
и так по циклу...

как тут наложить функциональное?

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

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

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

в общем я в шоке

может ли ктото мне немного разжевать саму идеологию применения функционального языка в таких задач? понятно что есть erlang — но по нему у меня книги нет. а что он что haskel по сути своей функциональные. и после того как пойму общую идеологию. потом смогу ее натянуть на любой функциональный язык..

Спасибо
... << RSDN@Home 1.2.0 alpha rev. 747>>
silent
Я не умею быть злым, и не хочу быть добрым.
Re: вопрос функциональщикам
От: BulatZiganshin  
Дата: 18.09.07 21:39
Оценка: 18 (2)
I>может ли ктото мне немного разжевать саму идеологию применения функционального языка в таких задач?

скжем так — нет какой-то общей идеологии функциональных или ООП языков, но есть фактические отличия нынешгих популярных языков (C, Java...) от Haskell и Erlang. вот те из них, которые будут иметь значение для этой задачи:

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

реализация твоей задачи может выглядеть примерно так:

main = do com  <- replicateM 4 newMVar  -- создаём 4 мьютекса для синхронизации работы с 4 компортами
          files <- mapM ((`fileOpen` WriteMode).show) [0..9] -- создаём файлы с именами "0".."9" для записи данных
          mapM_ (forkIO$ service com files)
              [ (0, 0x48, 100, 0)   -- список (номер ком-порта, адрес Modbus, частота сканирования, номер файла),
              , (0, 0x88, 0,   1)   --   описывающий откуда и с какой частотой читать данные и куда их записывать
              ...]

service com files (port, addr, delay, filenum) = do
    x <- withMVar (com!port) $ do             -- блокируем доступ других потоков к этому ком-порту
        ...                                   -- читаем данные из ком-порта
    hPutStrLn (files!filenum) x               -- записываем данные в файл
    wait delay                                -- ожидаем заданное число микросекунд
    service com (port, addr, delay, filenum)  -- рекурсия используется для организации бесконечного цикла


за исключением функций работы с ком-портом и реализации протокола обмена, это полная реализация
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: вопрос функциональщикам
От: ironwit Украина  
Дата: 19.09.07 05:20
Оценка: +1
Здравствуйте, BulatZiganshin, Вы писали:

I>>может ли ктото мне немного разжевать саму идеологию применения функционального языка в таких задач?


BZ>скжем так — нет какой-то общей идеологии функциональных или ООП языков, но есть фактические отличия нынешгих популярных языков (C, Java...) от Haskell и Erlang. вот те из них, которые будут иметь значение для этой задачи:

если често то просто обалдел так мало строк

еще немного подумаю вчитаюсь спасибо.
... << RSDN@Home 1.2.0 alpha rev. 747>>
silent
Я не умею быть злым, и не хочу быть добрым.
Re: вопрос функциональщикам
От: Gaperton http://gaperton.livejournal.com
Дата: 19.09.07 10:07
Оценка:
Здравствуйте, ironwit, Вы писали:

I>Читаю тут книгу по хаскелю. соответственно все новое пытаюсь сразу наложить на нужную мне задачу. Задача такова:

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

I>как тут наложить функциональное?


Проблема, пнимаешь . Не ту книгу читаешь. Для твоей задачи надо читать книгу по Эрлангу.

log_message( LogFile ) ->
   receive Message -> log_to_file( Message, File ) end,
   log_message( LogFile ).

start_logging( LogFile, [ Port | PortsList ] ) ->
   Port ! { subscribe, self() },
   start_logging( LogFile, PortsList );

start_logging( LogFile, [] ) -> log_message( LogFile ).


И все. В Хаскеле то же самое можно устроить через ленивые списки и бесконечно-рекурсиные функции ("потоки", они же streams)
Re[2]: вопрос функциональщикам
От: ironwit Украина  
Дата: 19.09.07 11:48
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


I>>Читаю тут книгу по хаскелю. соответственно все новое пытаюсь сразу наложить на нужную мне задачу. Задача такова:

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

I>>как тут наложить функциональное?


G>Проблема, пнимаешь . Не ту книгу читаешь. Для твоей задачи надо читать книгу по Эрлангу.


давай русскую книгу по ерлангу или англ но простую. там вообще книга по обучению студентов функциональщине на haskel
... << RSDN@Home 1.2.0 alpha rev. 747>>
silent
Я не умею быть злым, и не хочу быть добрым.
Re[2]: вопрос функциональщикам
От: BulatZiganshin  
Дата: 19.09.07 12:34
Оценка:
G>И все. В Хаскеле то же самое можно устроить через ленивые списки и бесконечно-рекурсиные функции ("потоки", они же streams)

ты на нём не работал, видимо — ленивые списки должны вычисляться без использования побочных эффектов. так что решение на хаскеле точно такое же, как и на эрланге
Люди, я люблю вас! Будьте бдительны!!!
Re[3]: вопрос функциональщикам
От: Gaperton http://gaperton.livejournal.com
Дата: 19.09.07 12:49
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

G>>И все. В Хаскеле то же самое можно устроить через ленивые списки и бесконечно-рекурсиные функции ("потоки", они же streams)


BZ>ты на нём не работал, видимо — ленивые списки должны вычисляться без использования побочных эффектов. так что решение на хаскеле точно такое же, как и на эрланге


Видимо, ты не применял технику декомпозицию через потоки (ленивые списки), на которой в частности у нас строятся все модели харда на Хаскле. Тебе никто не мешает внутри бесконечно-рекурсивной функции "принимающей и отправляющей" данные через потоки поставить unsafePerformIO. Это совершенно безопасно — если иметь в виду семантику, что эти функции работают как бы параллельно.
Re[3]: вопрос функциональщикам
От: BulatZiganshin  
Дата: 19.09.07 12:53
Оценка: 4 (1)
I>если често то просто обалдел так мало строк

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

вообще-то говоря, самым главным языком для программистов является английский, но тем не менее:

http://rsdn.ru/article/erlang/GettingStartedWithErlang.xml
Автор(ы):
Дата: 06.12.2006
В далеком 1985-м году группа разработчиков из компьтерных лабораторий компании Ericsson решила создать язык, который идеально бы подхо-дил для решения задач в телекоме. Шесть лет спустя, в 1991-м, миру был представлен такой язык – Erlang.
С 1992 года Erlang начал применяться в компании Ericsson для разработки телекомуникационного оборудования. Например, бoльшая часть функцио-нальности флагманского продукта компании, свитча AXD-301, реализована с использованием Erlang-а.
В 1998 году были опубликованы исходные коды языка и его библиотек. С тех пор Erlang стал не просто языком для телекоммуникационных прило-жений, а полноценным языком общего назначения. Ericsson до сих пор развивает Erlang, и его бесплатная версия собирается из тех же исходников, что и коммерческая.
Это – простая обучающая статья, посвященная началам работы с Erlang.

http://erlang.dmitriid.com/wiki/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0

http://www.haskell.ru/ (это громоздкое офиц. описание языка)
http://ru.wikibooks.org/
http://www.haskell.org/haskellwiki/Ru/IO#.D0.A1.D1.81.D1.8B.D0.BB.D0.BA.D0.B8
Люди, я люблю вас! Будьте бдительны!!!
Re[3]: вопрос функциональщикам
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 19.09.07 15:31
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>ты на нём не работал, видимо — ленивые списки должны вычисляться без использования побочных эффектов. так что решение на хаскеле точно такое же, как и на эрланге


Да ну, вспомни диалоги, да и никто не мешает завернуть всё это дело в IO.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: вопрос функциональщикам
От: BulatZiganshin  
Дата: 19.09.07 16:02
Оценка:
Здравствуйте, lomeo, Вы писали:

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


BZ>>ты на нём не работал, видимо — ленивые списки должны вычисляться без использования побочных эффектов. так что решение на хаскеле точно такое же, как и на эрланге


L>Да ну, вспомни диалоги, да и никто не мешает завернуть всё это дело в IO.


я говаорю не о всяких теоретичсеких возможностях, а о том, как это надо программировать, тем более начинающему. и ленивые вычисления здесь не подойдут ввиду императивности выполняемых действий
Люди, я люблю вас! Будьте бдительны!!!
Re[4]: вопрос функциональщикам
От: BulatZiganshin  
Дата: 20.09.07 07:36
Оценка: 8 (1)
BZ>вообще-то говоря, самым главным языком для программистов является английский, но тем не менее:

и наше всё : http://www.haskell.org/bz/FreeArc-sources.tar.gz
Люди, я люблю вас! Будьте бдительны!!!
Re[5]: вопрос функциональщикам
От: BulatZiganshin  
Дата: 24.09.07 10:47
Оценка: 2 (1)
Здравствуйте, BulatZiganshin, Вы писали:

BZ>>вообще-то говоря, самым главным языком для программистов является английский, но тем не менее:


BZ>и наше всё : http://www.haskell.org/bz/FreeArc-sources.tar.gz


отныне и присно и во веки веков http://www.haskell.org/bz/FreeArc-sources.zip

зато там появился readme и максимально упростился процесс компиляции
Люди, я люблю вас! Будьте бдительны!!!
Re[4]: вопрос функциональщикам
От: thesz Россия http://thesz.livejournal.com
Дата: 24.09.07 12:51
Оценка:
G>Видимо, ты не применял технику декомпозицию через потоки (ленивые списки), на которой в частности у нас строятся все модели харда на Хаскле. Тебе никто не мешает внутри бесконечно-рекурсивной функции "принимающей и отправляющей" данные через потоки поставить unsafePerformIO. Это совершенно безопасно — если иметь в виду семантику, что эти функции работают как бы параллельно.

Это делать нельзя в общем случае (например, чтение из одного файла).

То, как делать можно, описано в описании Fudgets.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[5]: вопрос функциональщикам
От: Gaperton http://gaperton.livejournal.com
Дата: 24.09.07 15:55
Оценка:
Здравствуйте, thesz, Вы писали:

G>>Видимо, ты не применял технику декомпозицию через потоки (ленивые списки), на которой в частности у нас строятся все модели харда на Хаскле. Тебе никто не мешает внутри бесконечно-рекурсивной функции "принимающей и отправляющей" данные через потоки поставить unsafePerformIO. Это совершенно безопасно — если иметь в виду семантику, что эти функции работают как бы параллельно.


T>Это делать нельзя в общем случае (например, чтение из одного файла).


Что, даже читать из одного файла нельзя? Это довольно странно. И что будет, если все-таки прочитать? Может, ты имел в виду, что туда нельзя писать из разных?
Re[6]: вопрос функциональщикам
От: BulatZiganshin  
Дата: 24.09.07 16:50
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


G>>>Видимо, ты не применял технику декомпозицию через потоки (ленивые списки), на которой в частности у нас строятся все модели харда на Хаскле. Тебе никто не мешает внутри бесконечно-рекурсивной функции "принимающей и отправляющей" данные через потоки поставить unsafePerformIO. Это совершенно безопасно — если иметь в виду семантику, что эти функции работают как бы параллельно.


T>>Это делать нельзя в общем случае (например, чтение из одного файла).


G>Что, даже читать из одного файла нельзя? Это довольно странно. И что будет, если все-таки прочитать? Может, ты имел в виду, что туда нельзя писать из разных?


во-первых, указатель текущей позиции один на всех, во-вторых, нет гарантий атоммарности операции. на практике например putStrLn, реализованный как два putStr, ведёт себя очень забавно при вызове в параллельных тредах
Люди, я люблю вас! Будьте бдительны!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.