Haskell अन्य भाषाओं में return
के रूप में एक ही बात नहीं करता है में 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()
एक और विकल्प 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()
सामान्य समस्या यहाँ उपयोग करने के लिए है IO
इकाई नहीं है वह यह है कि उपयोग करने के लिए है नियंत्रण प्रभाव (अपवादों को छोड़कर)। दूसरी ओर, आप शायद इकाई ट्रांसफार्मर
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()
इस्तेमाल कर सकते हैं यदि आप वास्तव में पूर्ण विकसित नियंत्रण प्रभाव आप उपयोग करना 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()
चेतावनी की जरूरत प्राप्त करना चाहते हैं: उपरोक्त कोड में से कोई भी कर दिया गया है परीक्षण किया, या यहां तक कि टाइप की जाँच की!
स्रोत
2013-03-15 21:15:25
क्या आप यह चाहते हैं? http://www.haskellforall.com/2012/07/breaking-from-loop.html –