52700.fb2
громкости составляет 10 единиц, а минимальный ноль единиц. Границы диапазона громкости описываются
такими функциями:
quieter :: Level -> Level
quieter (Level n) = Level $ max 0 (n-1)
louder :: Level -> Level
louder (Level n) = Level $ min 10 (n+1)
Мы будем обновлять значения уровня громкости не напрямую, а с помощью вспомогательных функций
louder и quieter. Так мы не сможем выйти за пределы заданного диапазона.
Возможные события:
108 | Глава 7: Функторы и монады: примеры
data User = Button | Quieter | Louder
deriving (Show)
Пользователь может либо нажать на кнопку вкл/выкл или повернуть реле громкости влево, чтобы при-
глушить звук (Quieter) или вправо, чтобы сделать погромче (Louder). Будем считать, что колонки всегда
включены в розетку.
Составим функцию переходов:
speaker :: User -> FSM Speaker
speaker = fsm $ trans
where trans Button
(Sleep, n) = (Work, n)
trans Button
(Work,
n) = (Sleep, n)
trans Louder
(s,
n) = (s, louder n)
trans Quieter
(s,
n) = (s, quieter n)
Мы считаем, что при выключении колонок реле остаётся некотором положении, так что при следующем
включении они будут работать на той же громкости. Реле можно крутить и в состоянии Sleep. Посмотрим
на типичную сессию работы колонок:
*FSM> let res = mapM speaker [Button, Louder, Quieter, Quieter, Button]
Сначала мы включаем колонки, затем прибавляем громкость, затем дважды делаем тише и в конце вы-
ключаем. Посмотрим что получилось:
*FSM> runState res (Sleep, Level 2)
([(Sleep, Level 2),(Work, Level 2),(Work, Level 3),(Work, Level 2),
(Work, Level 1)],(Sleep, Level 1))
*FSM> runState res (Sleep, Level 0)
([(Sleep, Level 0),(Work, Level 0),(Work, Level 1),(Work, Level 0),
(Work, Level 0)],(Sleep, Level 0))
Смотрите, изменив начальное значение, мы изменили весь список значений. Обратите внимание на то,
что во втором прогоне мы не ушли в минус по громкости, не смотря на то, что пытались крутить реле за
установленный предел.
Определим колонки другого типа. Наши новые колонки будут безопаснее предыдущих. Представьте си-
туацию, что мы выключили колонки на высоком уровне громкости. Мы слушали домашнюю запись с низким
уровнем звука. Мы выключили и забыли. Потом мы решили послушать другую мелодию, которая записана
с нормальным уровнем звука. При включении колонок нас оглушил шквал звука. Чтобы этого избежать мы
решили воспользоваться другими колонками.