我在避开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")
感谢您的帮助!
答案 0 :(得分:3)
如果您所在的monad m
属于MonadIO
类,则可以使用liftIO :: IO a -> m a
在其中执行IO操作。
对于Yesod,您可以在其Handler
操作以及Persistent的runDB
块中执行IO操作。