Как называется эта функция стека монад?

У меня есть набор функций с отслеживанием состояния внутри монады State. В какой-то момент программы должны быть некоторые действия ввода-вывода, поэтому я обернул ввод-вывод внутри StateT, получив пару таких типов:

mostfunctions :: State Sometype a
toplevel :: StateT Sometype IO a

Для простоты я не хочу передавать контекст ввода-вывода в основной набор функций, и я бы не хотел заключать их в тип стека монад. Но для вызова их из функции верхнего уровня мне нужно что-то вроде лифта, но я не пытаюсь поднять значение из внутренней монады. Скорее я хочу преобразовать состояние в монаде StateT в нечто эквивалентное в монаде State. Для этого у меня есть следующее:

wrapST :: (State Sometype a) -> StateT Sometype IO a
wrapST f = do s <- get
              let (r,s2) = runState f s 
              put s2
              return r

Затем я привыкаю чередовать такие вещи, как следующее:

toplevel = do liftIO $ Some IO functions
              wrapST $ Some state mutations
              liftIO $ More IO functions
              ....

Это кажется довольно очевидным блоком кода, поэтому мне интересно, имеет ли эта функция стандартное имя, и это уже где-то реализовано в стандартных библиотеках? Я попытался сделать описание простым, но очевидно, что это распространяется на извлечение одного трансформатора из стека, преобразование обернутого значения в двоюродный брат типа трансформатора, пропуск монад ниже в стеке, а затем возвращение результатов обратно в конец.

7
задан Andrew 11 May 2011 в 17:10
поделиться