мне нужно вернуться обратно в Action M, но я не знаю как. Если же я выйду из скоупа withSystemTempDir, то потеряю файл.
S.post "/endpoint" $ do
-- enter Action M
fs <- S.files
liftIO $ withSystemTempDirectory "foo" $ \tempDirPath -> do
-- enter IO (lift to Action M)
let filePath = tempDirPath <> "/" <> "bar"
...
S.file filePath -- need Action M
Насколько я понимаю, тут не требуется liftIO. withSystemTempDirectory работает в любой монаде m, такой, что MonadIO m и MonadMask m. ActionM удовлетворяет обоим условиям, вроде как.
Есть несколько идей. Во-первых, MonadUnliftIO (ActionT m), поэтому можно использовать возможности пакета unliftio (к сожалению, пока не понял, как). Во-вторых, есть runAM, которая превращает (в версии 0.20, по крайней мере) ActionM в ReaderT ActionEnv IO, а это уже относится к MonadMask. Можно поэтому ставить ActionM вместо liftIO, а перед S.file … ставить runAM $. P.S. Наверное, лучше было бы разобраться в unliftio.
тебе буквально надо заменить liftIO $ withSystemTempDirectory на withSystemTempDirectory из unliftio и всё заработает
Класс, да теперь работает, спасибо
https://hackage.haskell.org/package/scotty-0.22/docs/Web-Scotty-Trans.html#v:filesOpts
Обсуждают сегодня