OberonCore
https://forum.oberoncore.ru/

Малаховски, Шалыто - Конечные автоматы в чистых ФЯ
https://forum.oberoncore.ru/viewtopic.php?f=72&t=2334
Страница 1 из 1

Автор:  Geniepro [ Среда, 10 Февраль, 2010 07:13 ]
Заголовок сообщения:  Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

Я. М. Малаховски, А. А. Шалыто
СПБГУ ИТМО

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

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

Автор:  Илья Ермаков [ Среда, 10 Февраль, 2010 21:15 ]
Заголовок сообщения:  Re: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

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

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

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

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

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

Автор:  Alexey Veselovsky [ Четверг, 11 Февраль, 2010 10:55 ]
Заголовок сообщения:  Re: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

Да ладно. Нет там особых наворотов. Там всё более-менее понятно. Даже мне.

Автор:  Geniepro [ Четверг, 11 Февраль, 2010 11:42 ]
Заголовок сообщения:  Re: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

Я так понял, что Илья не конкретно об этой статье, а вообще о современном ФП.

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

Автор:  Alexey Veselovsky [ Четверг, 11 Март, 2010 17:19 ]
Заголовок сообщения:  Re: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

http://rsdn.ru/article/haskell/HaskellS ... .xml#E2EAC
Цитата:
Отличие этого триггера от предыдущего состоит в том, что лампа будет включаться или выключаться только после отпускания кнопки, а повторное нажатие или отпускание кнопки не будет производить никакого эффекта.


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

Автор:  Geniepro [ Пятница, 12 Март, 2010 08:12 ]
Заголовок сообщения:  Re: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

Да там вообще стиль написания программ какой-то совсем не хаскельный. Вот такой ужасный код:
Код:
-- Функция переходов для счетного триггера.
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:

Автор:  Alexey Veselovsky [ Пятница, 12 Март, 2010 10:39 ]
Заголовок сообщения:  Re: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

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"]) -- скорее всего тут не совсем так будет.

Автор:  Geniepro [ Пятница, 12 Март, 2010 11:56 ]
Заголовок сообщения:  Re: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

Кстати, я наврал там в последней строке, она должна быть такой:
Код:
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...

Автор:  Alexey Veselovsky [ Понедельник, 22 Март, 2010 12:10 ]
Заголовок сообщения:  Re: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

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. :-)

Автор:  Geniepro [ Понедельник, 22 Март, 2010 13:00 ]
Заголовок сообщения:  Re: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

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

Автор:  Alexey Veselovsky [ Понедельник, 22 Март, 2010 13:29 ]
Заголовок сообщения:  Re: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

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


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

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

Автор:  Geniepro [ Понедельник, 22 Март, 2010 13:47 ]
Заголовок сообщения:  Re: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ

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

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/