如何避免Handler Monad中的unsafePerformIO?

时间:2017-08-20 08:16:10

标签: haskell monads yesod

我在避开Yesod Handler中的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")

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

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

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