В большинстве объяснений монады используются примеры, где монада обертывает значение. Например. Maybe a
, где переменная типа a
- это то, что завернуто. Но мне интересно о монадах, которые никогда ничего не обертывают.
Для надуманного примера предположим, что у меня есть реальный робот, который можно контролировать, но не имеет датчиков. Может быть, я хотел бы контролировать это следующим образом:
robotMovementScript :: RobotMonad ()
robotMovementScript = do
moveLeft 10
moveForward 25
rotate 180
main :: IO ()
main =
liftIO $ runRobot robotMovementScript connectToRobot
В нашем воображаемом API connectToRobot
возвращает какой-то дескриптор физического устройства. Это соединение становится "контекстом" RobotMonad
. Поскольку наше соединение с роботом никогда не может отправить нам значение, конкретный тип монады всегда RobotMonad ()
.
Некоторые вопросы:
- Может ли мой надуманный пример выглядеть правильно?
- Я правильно понимаю идею монада "контекст"? Правильно ли я описываю соединение робота как контекст?
- Имеет ли смысл иметь монаду - например,
RobotMonad
- которая никогда не обертывает значение? Или это противоречит основному понятию монадов? - Моноиды лучше подходят для такого рода приложений? Я могу представить, как конкатенировать действия управления роботом с помощью
<>
. Хотя обозначениеdo
кажется более читаемым. - В определении монады было бы/могло бы быть что-то, что гарантирует, что тип всегда
RobotMonad ()
?
В качестве примера я рассмотрел Data.Binary.Put
. Кажется, он похож (или, может быть, идентичен?) На то, о чем я думаю. Но он также включает монадию Writer и моноид Builder. Учитывая эти добавленные морщины и мой текущий уровень мастерства, я думаю, что монада Put
может быть не самым поучительным примером.
Edit
На самом деле мне не нужно создавать робот или API вроде этого. Пример полностью надуман. Мне просто нужен был пример, где никогда не было бы причин вытащить ценность из монады. Поэтому я не прошу простейший способ решить проблему с роботом. Скорее, этот мысленный эксперимент о монадах без внутренних ценностей является попыткой лучше понять монады в целом.