OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 19 Октябрь, 2019 01:07

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 10 Февраль, 2010 07:13 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Я. М. Малаховски, А. А. Шалыто
СПБГУ ИТМО

Конечные автоматы в чистых функциональных языках программирования.
Автоматы и Haskell
http://rsdn.ru/article/haskell/HaskellStateMachine.xml

ЗЫ. Всегда знал, что Хаскелл идеален для этих самых конечных автоматов...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Февраль, 2010 21:15 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9147
Откуда: Россия, Орёл
Функциональщикам надо перестать заниматься "нотационным терроризмом" - был бы большой прогресс.
А то беда, как и многих неприкладных математиков, - мнение, что заковыристая и изящно-офигенно-"выразительная" нотация (и стоящая за ней семантика) должна сразу всех приводить в восторг.

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

Проще надо, как всегда.

Лучше длинно, тупо и надёжно.

Если мне понадобится что-то из ФП (а идеи эти постоянно помогают) - я точно знаю, что не буду разбираться с существующими наворотами, а буду делать свой мини-интерфейс библиотечный и рантаймчик. Собственно, как уже делал с Рефалом-0.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 11 Февраль, 2010 10:55 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Да ладно. Нет там особых наворотов. Там всё более-менее понятно. Даже мне.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 11 Февраль, 2010 11:42 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Я так понял, что Илья не конкретно об этой статье, а вообще о современном ФП.

А у статьи этой недостаток в том, что написана она скучно -- я чуть не уснул вчера, пока читал :lol:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 11 Март, 2010 17:19 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
http://rsdn.ru/article/haskell/HaskellS ... .xml#E2EAC
Цитата:
Отличие этого триггера от предыдущего состоит в том, что лампа будет включаться или выключаться только после отпускания кнопки, а повторное нажатие или отпускание кнопки не будет производить никакого эффекта.


Эмм... Возможно я совсем отупел, но я, с точки зрения пользователя, слабо себе представляю как можно ещё раз нажать на кнопку, предварительно её не отжав. Т.е. получить последовательность событий ButtonDwn, ButtonDwn, вместо ButtonDwn, ButtonUp, ButtonDwn.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 12 Март, 2010 08:12 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Да там вообще стиль написания программ какой-то совсем не хаскельный. Вот такой ужасный код:
Код:
-- Функция переходов для счетного триггера.
triggerSwitchFunc state event = case state of
    LampOffButtonUp -> case event of
        ButtonDown -> (LampOffButtonDown, [])
        _ -> (state, [])
    LampOnButtonUp -> case event of
        ButtonDown -> (LampOnButtonDown, [])
        _ -> (state, [])
    LampOffButtonDown -> case event of
        ButtonUp -> (LampOnButtonUp, [putStrLn "LampOn"])
        _ -> (state, [])
    LampOnButtonDown -> case event of
        ButtonUp -> (LampOffButtonUp, [putStrLn "LampOff"])
        _ -> (state, [])
гораздо лучше и понятнее выглядит так:
Код:
-- Функция переходов для счетного триггера.
triggerSwitchFunc LampOffButtonUp   ButtonDown = (LampOffButtonDown, [])
triggerSwitchFunc LampOnButtonUp    ButtonDown = (LampOnButtonDown,  [])
triggerSwitchFunc LampOffButtonDown ButtonUp   = (LampOnButtonUp,    [putStrLn "LampOn"])
triggerSwitchFunc LampOnButtonDown  ButtonUp   = (LampOffButtonUp,   [putStrLn "LampOff"])
triggerSwitchFunc _                 _          = (state,             [])

ЗЫ. А теперь перепишите это на Окамль :lol:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 12 Март, 2010 10:39 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Geniepro писал(а):
Да там вообще стиль написания программ какой-то совсем не хаскельный. Вот такой ужасный код:
Код:
-- Функция переходов для счетного триггера.
triggerSwitchFunc state event = case state of
    LampOffButtonUp -> case event of
        ButtonDown -> (LampOffButtonDown, [])
        _ -> (state, [])
    LampOnButtonUp -> case event of
        ButtonDown -> (LampOnButtonDown, [])
        _ -> (state, [])
    LampOffButtonDown -> case event of
        ButtonUp -> (LampOnButtonUp, [putStrLn "LampOn"])
        _ -> (state, [])
    LampOnButtonDown -> case event of
        ButtonUp -> (LampOffButtonUp, [putStrLn "LampOff"])
        _ -> (state, [])
гораздо лучше и понятнее выглядит так:
Код:
-- Функция переходов для счетного триггера.
triggerSwitchFunc LampOffButtonUp   ButtonDown = (LampOffButtonDown, [])
triggerSwitchFunc LampOnButtonUp    ButtonDown = (LampOnButtonDown,  [])
triggerSwitchFunc LampOffButtonDown ButtonUp   = (LampOnButtonUp,    [putStrLn "LampOn"])
triggerSwitchFunc LampOnButtonDown  ButtonUp   = (LampOffButtonUp,   [putStrLn "LampOff"])
triggerSwitchFunc _                 _          = (state,             [])

ЗЫ. А теперь перепишите это на Окамль :lol:


Ну да, меня это тоже убило. Вместо понятной таблицы переходов, какая-то жуткая каша из кода.
А на окамле (или F#? я только вчера начал как-то ковырять эти языки. пока разбирался с инструментарием) это ж вроде будет что-то вроде:
Код:
let triggerSwitchFunc a b = match (a,b) with
                           | LampOffButtonUp, ButtonDown -> (LampOffButtonDown, [])
                           | LampOnButtonUp,  ButtonDown -> (LampOnButtonDown,  [])
                           | LampOffButtonDown, ButtonUp -> (LampOnButtonUp,    [putStrLn "LampOn"])
                           | LampOnButtonDown,  ButtonUp -> (LampOffButtonUp,   [putStrLn "LampOff"])
                           | _ , _                       -> (state,[]);;

Где-то мог наврать. Особенно в месте где [putStrLn "LampOn"]) -- скорее всего тут не совсем так будет.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 12 Март, 2010 11:56 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Кстати, я наврал там в последней строке, она должна быть такой:
Код:
triggerSwitchFunc state             _          = (state,             [])
иначе непонятно, откуда state взялся.

Alexey Veselovsky писал(а):
А на окамле (или F#? я только вчера начал как-то ковырять эти языки. пока разбирался с инструментарием) это ж вроде будет что-то вроде:
Код:
let triggerSwitchFunc a b = match (a,b) with
                           | LampOffButtonUp, ButtonDown -> (LampOffButtonDown, [])
                           | LampOnButtonUp,  ButtonDown -> (LampOnButtonDown,  [])
                           | LampOffButtonDown, ButtonUp -> (LampOnButtonUp,    [putStrLn "LampOn"])
                           | LampOnButtonDown,  ButtonUp -> (LampOffButtonUp,   [putStrLn "LampOff"])
                           | _ , _                       -> (state,[]);;

Записать можно даже красивше (в F#):
Код:
let triggerSwitchFunc = function
    | LampOffButtonUp,   ButtonDown -> (LampOffButtonDown, [])
    | LampOnButtonUp,    ButtonDown -> (LampOnButtonDown,  [])
    | LampOffButtonDown, ButtonUp   -> (LampOnButtonUp,    [printf "LampOn"])
    | LampOnButtonDown,  ButtonUp   -> (LampOffButtonUp,   [printf "LampOff"])
    | state,             _          -> (state,             [])
В чём-то это даже более приятно выглядит, чем на Хаскелле...

Alexey Veselovsky писал(а):
Где-то мог наврать. Особенно в месте где [putStrLn "LampOn"]) -- скорее всего тут не совсем так будет.

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

Окамль же энергичный язык, там нужно будет использовать явные ленивые вычисления.
В F#, наверное, для этого надо использовать аналог монад -- workflow...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Март, 2010 12:10 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Geniepro писал(а):
Записать можно даже красивше (в F#):
Код:
let triggerSwitchFunc = function
    | LampOffButtonUp,   ButtonDown -> (LampOffButtonDown, [])
    | LampOnButtonUp,    ButtonDown -> (LampOnButtonDown,  [])
    | LampOffButtonDown, ButtonUp   -> (LampOnButtonUp,    [printf "LampOn"])
    | LampOnButtonDown,  ButtonUp   -> (LampOffButtonUp,   [printf "LampOff"])
    | state,             _          -> (state,             [])
В чём-то это даже более приятно выглядит, чем на Хаскелле...

Оно в точности так же будет выглядеть и на ocaml'e. :-)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Март, 2010 13:00 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Alexey Veselovsky писал(а):
Оно в точности так же будет выглядеть и на ocaml'e. :-)
В F# всё-таки light-синтаксис -- более питоноподобный, без лишних точек с запятой и end'ов.
http://blogs.msdn.com/dsyme/archive/200 ... 15626.aspx


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Март, 2010 13:29 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Geniepro писал(а):
Alexey Veselovsky писал(а):
Оно в точности так же будет выглядеть и на ocaml'e. :-)
В F# всё-таки light-синтаксис -- более питоноподобный, без лишних точек с запятой и end'ов.
http://blogs.msdn.com/dsyme/archive/200 ... 15626.aspx


В современном окамле тоже далеко не всегда нужно ставить ;; например. Например их не надо ставить перед следующим let.

Кстати, с F# я как-то не шибко понял -- вроде как пишут что нужно втыкать директиву #light чтобы избавиться от лишних in и ;;, однако у меня всё прекрасно работает и без этой директивы. Да и в спецификации языка я про нее не нашел.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 22 Март, 2010 13:47 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Alexey Veselovsky писал(а):
Кстати, с F# я как-то не шибко понял -- вроде как пишут что нужно втыкать директиву #light чтобы избавиться от лишних in и ;;, однако у меня всё прекрасно работает и без этой директивы. Да и в спецификации языка я про нее не нашел.

Раньше было нужно указывать эту прагму. В последних двух версиях компилятора #light включен по умолчанию.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB