Кстати, я наврал там в последней строке, она должна быть такой:
## Код:
```
triggerSwitchFunc state             _          = (state,             [])
```
иначе непонятно, откуда state взялся.

> -- Alexey Veselovsky писал(а):
> А на окамле (или F#? я только вчера начал как-то ковырять эти языки. пока разбирался с инструментарием) это ж вроде будет что-то вроде:
Записать можно даже красивше (в 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...