2009-05-07 14 views
65

मैं हास्केल में कुछ ऐसा है जो इस तरह दिखता है क्या करना चाहते हैं:हास्केल "कुछ भी नहीं" आईओ, या यदि बिना किसी

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

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

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

उत्तर

90

एक इकाई में नो-सेशन करने के लिए सबसे आसान तरीका है:

return() 

हालांकि, विशेष मुहावरा आप कर रहे हैं के लिए, वहाँ एक Combinator पहले से ही आपके लिए बनाया गया है:

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

यह when Combinator वास्तव में अपने doIf Combinator तरह बर्ताव करता है :)

+0

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

+3

रिटर्न इसके लिए एक बुरा नाम है, हाँ :) – bdonlan

+7

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

17

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

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

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

संबंधित मुद्दे