हास्केल "कुछ भी नहीं" आईओ, या यदि बिना किसी और के


81

मैं हास्केल में कुछ ऐसा करना चाहता हूं जो ऐसा दिखता है:

main1 = do s <- getLine
           if s == "foo" then putStr "You entered foo"

जाहिर है कि यह कानूनी नहीं है क्योंकि वहाँ कोई नहीं है else। एक विकल्प जो मैंने सोचा है:

nop :: IO ()
nop = sequence_ []

main2 = do s <- getLine
           if s == "foo" then putStr "You entered foo" else nop

यह थोड़ी सी क्रिया है, लेकिन यदि आवश्यक हो तो मैं इसके लिए समझौता करूंगा। मुझे आश्चर्य होगा कि अगर कोई अंतर्निहित संस्करण नहीं था nop, हालांकि।

वैकल्पिक रूप से:

doIf :: Bool -> IO () -> IO ()
doIf b m = if b then m else nop

main3 = do s <- getLine
           doIf (s == "foo") (putStr "You entered foo")

यह अधिक संक्षिप्त है, लेकिन वाक्यविन्यास विशेष रूप से अच्छा नहीं है। फिर से, मुझे ऐसा कुछ आश्चर्यचकित नहीं होगा, जो पहले से मौजूद हो।

ऐसा करने का पसंदीदा तरीका क्या है?

जवाबों:


116

एक सनक में एक सेशन नहीं करने का सबसे आसान तरीका है:

return ()

समान रूप से:

pure ()

हालाँकि, आपके द्वारा किए जा रहे विशेष मुहावरे के लिए, आपके लिए पहले से बनाया हुआ एक संयोजन है:

import Control.Monad
main = do s <- getLine
          when (s == "foo") $ putStr "You entered foo"

यह whenकॉम्बिनेटर आपके doIfकॉम्बिनेटर की तरह ही व्यवहार करता है :)


1
वूप्स, मैंने वापसी के बारे में सोचा () लेकिन सोच रहा था कि यह वास्तव में वापस आ जाएगी (यानी शॉर्ट-सर्किट बाकी सामानों की अभिव्यक्ति में)। मेरी गलती। जब सूचक के लिए धन्यवाद।
डेव बी

7
वापसी इसके लिए एक बुरा नाम है, हाँ :)
bdonlan

9
@ ध्यान रखें कि returnहास्केल एक भाषा निर्माण नहीं है, यह सिर्फ एक फ़ंक्शन है (एक बुरी तरह से चयनित नाम के साथ, बोडोनियन के रूप में)। वापसी नियंत्रण प्रवाह, या कुछ और को प्रभावित नहीं करती है, आप लिख सकते हैं: do {s <- getLine; return (); putStrLn s}जो कि ठीक निष्पादित करेगा।
टॉम लोखोर

के Not in scope: `when'लिए मिल रहा हूं test = do (when True (putStrLn "Hello"))
क्वाटर्ली

3
ओह, फ़ाइल के शीर्ष पर की whenआवश्यकता है import Control.Monad
क्वर्टी

21

आप उपयोग कर सकते हैं Hoogle कार्यों को खोजने के लिए, इस मामले में: when

Hoogle में, आप टाइप हस्ताक्षर दर्ज कर सकते हैं, और यह मानक पुस्तकालयों में मिलान प्रकारों को एकीकृत करके और पुन: व्यवस्थित करने के लिए मिलान कार्यों को खोजने का प्रयास करेगा।

आपके मामले में, आप बस अपने doIfफ़ंक्शन का प्रकार दर्ज कर सकते हैं : बूल -> आईओ () -> आईओ () whenतीसरा जवाब यहां है, इसका उल्टा unlessभी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.