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: Малаховски, Шалыто - Конечные автоматы в чистых ФЯ |
Я так понял, что Илья не конкретно об этой статье, а вообще о современном ФП. А у статьи этой недостаток в том, что написана она скучно -- я чуть не уснул вчера, пока читал |
Автор: | 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, []) ЗЫ. А теперь перепишите это на Окамль |
Автор: | 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, []) ЗЫ. А теперь перепишите это на Окамль Ну да, меня это тоже убило. Вместо понятной таблицы переходов, какая-то жуткая каша из кода. А на окамле (или 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/ |