return
trong Haskell không làm điều tương tự như return
bằng các ngôn ngữ khác. Thay vào đó, những gì return
làm là để tiêm một giá trị vào một đơn nguyên (trong trường hợp này là IO
). Bạn có một vài tùy chọn
đơn giản nhất là sử dụng nếu
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()
tùy chọn khác là sử dụng 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()
vấn đề chung ở đây là rằng IO
đơn nguyên không có hiệu ứng kiểm soát (ngoại trừ trường hợp ngoại lệ). Mặt khác, bạn có thể sử dụng máy biến áp có lẽ đơn nguyên
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()
nếu bạn thực sự muốn có được đầy đủ các hiệu ứng kiểm soát thổi bạn cần phải sử dụng 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()
CẢNH BÁO: không ai trong số các mã trên đã được kiểm tra, hoặc thậm chí loại kiểm tra!
Nguồn
2013-03-15 21:15:25
Đây có phải là điều bạn muốn không? http://www.haskellforall.com/2012/07/breaking-from-loop.html –