如何避免 Handler Monad 中的 unsafePerformIO?

How to avoid unsafePerformIO in the Handler Monad?

我无法避免在 Yesod 处理程序中出现 unsafePerformIO。 Handler中的代码都在Handler Monad中,那么如何执行IO操作呢?

getProfileR :: Handler Html
getProfileR = do

  -- toTMDBMovie's return-type is IO Movie
  -- Without the unsafePerformIO the type of result would be IO [Movie]
  -- How do I get from IO [Movie] to [Movie]?
  -- Ignore reccMovies - it's just a parameter.

  let result = unsafePerformIO $ mapM toTMDBMovie reccMovies

  defaultLayout $ do
      setTitle "Profile"
      $(widgetFile "profile")

感谢您的帮助!

如果您正在使用的 monad m 属于 MonadIO class,您可以使用 liftIO :: IO a -> m a 在其中执行 IO 操作。

至于 Yesod,您可以在其 Handler 操作以及 Persistent 的 runDB 块中执行 IO 操作。