2017-08-20 7 views
0

YesodハンドラでunsafePerformIOを回避することに頭を悩ませてしまいました。 HandlerのコードはHandler Monadにありますので、どのようにIO操作を実行できますか?Handler MonadでunsafePerformIOを回避する方法は?

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") 

ありがとうございました!

+5

'Handler'は[MonadIO'](https://hackage.haskell.org/package/transformers-0.3.0.0/docs/Control-Monad-IO-Class.html)ですので、'結果< - liftIO $ mapM toTMDBMovie reccMovies' – luqui

+2

これは、もっと知りたい場合は[モナドトランスフォーマー](https://en.wikibooks.org/wiki/Haskell/Monad_transformers)に関連しています。 – luqui

+0

@luquiありがとう、それはまさに私が探していたものです。これを回答として投稿すると、正しいものとしてマークされます。 :) – Biffy

答えて

3

作業中のモナドmMonadIOクラスの場合、liftIO :: IO a -> m aを使用して内部でIOアクションを実行できます。

Yesodの場合、Handlerアクション、および永続的なrunDBブロックでIOアクションを実行できます。

関連する問題