Я пытаюсь преобразовать следующий императивный код состояния в Haskell.Этап состояния с различными типами разрывов
while (true) {
while (get()) {
if (put1()) {
failImmediately();
}
}
if (put2()) {
succeedImmediately();
}
}
И put1
и put2
читать состояние системы и изменить его. get
может для простоты просто прочитать состояние. failImmediately
должен вырваться из бесконечного цикла и представить один тип результата, succeedImmediately
также должен вырваться, но представить другой результат.
То, что я пытался использовать было State Env Result
где Env
представлял состояние окружающей среды и Result
было что-то вроде Either Failure Success
для некоторых пользовательских Failure
и Success
.
Я борюсь с требованием, чтобы целое результирующее выражение рухнуло в Failure
/Success
, когда один из них был произведен (нарушая цикл) и в противном случае продолжал идти.
Одна идея у меня было использовать Either Exit()
где data Exit = Success | Failure
и использовать StateT
как-то себя на Left
из Either
, как будто Either
была монада будучи прикован, т.е. игнорируя любые последующие действия.
Я был бы очень признателен за любое вдохновение или образец кода хэскеля, который достигнет такого же поведения, что и фрагмент выше.
Редактировать: уточненная версия перенесена на отдельный вопрос «Stateful computation with different types of short-circuit (Maybe, Either)».
Вы должны смотреть на [ 'EitherT (Государственный конв результат)'] (https://hackage.haskell.org/package/either-4.4.1/docs/Control-M onad-Транс-Either.html). Дайте мне знать, если этого намека недостаточно, и вам нужно больше информации :) – Cactus
У меня такое ощущение, что это может быть то, что мне нужно, но я не имею ни малейшего понятия, как использовать его в этом сценарии :(Если бы вы были так любезно продумать, я был бы так благодарен. – jakubdaniel