return
。代わりに、return
が行うのは、モナドに値を注入することです(この場合はIO
)。あなたはオプション
最も簡単なのカップルが
scrapePage :: String -> IO()
scrapePage url = do
doc <- fromUrl url
title <- liftM headMay $ runX $ doc >>> css "head.title" >>> getText
if (isNothing title) then return() else do
date <- liftM headMay $ runX $ doc >>> css "span.dateTime" ! "data-utc"
if (isNothing date) then return() else do
-- etc
-- make page object and send it to db
return()
別のオプションは、IO
モナドが持っていないされていることを、ここでunless
scrapePage url = do
doc <- fromUrl url
title <- liftM headMay $ runX $ doc >>> css "head.title" >>> getText
unless (isNothing title) do
date <- liftM headMay $ runX $ doc >>> css "span.dateTime" ! "data-utc"
unless (isNothing date) do
-- etc
-- make page object and send it to db
return()
一般的な問題を使用する場合に使用することである必要がありコントロール効果(例外を除く)。上記のコードのいずれも行われていない:あなたは本当にあなたがContT
scrapePage :: String -> IO()
scrapePage url = runContT return $ do
doc <- fromUrl url
title <- liftM headMay $ runX $ doc >>> css "head.title" >>> getText
when (isNothing title) $ callCC ($())
date <- liftM headMay $ runX $ doc >>> css "span.dateTime" ! "data-utc"
when (isNothing date) $ callCC ($())
-- etc
-- make page object and send it to db
return()
警告を使用する必要が本格的な制御効果を取得したい場合一方、あなたは多分モナド変圧器
scrapePage url = liftM (maybe() id) . runMaybeT $ do
doc <- liftIO $ fromUrl url
title <- liftIO $ liftM headMay $ runX $ doc >>> css "head.title" >>> getText
guard (isJust title)
date <- liftIO $ liftM headMay $ runX $ doc >>> css "span.dateTime" ! "data-utc"
guard (isJust date)
-- etc
-- make page object and send it to db
return()
を使用することができますテストしたり、タイプチェックしたりすることもできます。
これは必要なのですか? http://www.haskellforall.com/2012/07/breaking-from-loop.html –