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