Я хочу запустить randomIO
внутри своего StateT a STM b
, но получаю эту ошибку:
Expected type: StateT Session STM Float
Actual type: IO Float
поэтому я пытаюсь выполнить lift
из Control.Monad.Trans.Class
(реэкспортированного модулем State's Strict):
Expected type: StateT Session STM Float
Actual type: StateT Session IO Float
что ближе, но не совсем там. Я не могу liftIO
, потому что нет экземпляра MonadIO
для STM
.
Как я могу скомпилировать это, чтобы я мог запустить randomIO
внутри STM
внутри моего StateT
?
STM Float
, а неIO Float
. - person Willem Van Onsem   schedule 10.08.2019randomIO
. Вам нужно найти обходной путь, например предварительно сгенерировать ваши случайные числа перед входом в STM или передать состояние RNG в STM. - person chi   schedule 10.08.2019unsafeIOToSTM
, но, как следует из названия: это небезопасно, и поэтому лучше этого не делать. - person Willem Van Onsem   schedule 10.08.2019random
, каков эффект лени в этом сценарии, когда транзакция STM извлекает значение? Опасно ли проходить через преобразователь? - person Alex   schedule 12.08.2019