2011-02-06 15 views
5

मैं बहुत हास्केल के लिए नया हूँ, लेकिन अगर आप एक अगर बयान:हास्केल यदि बयान

function a b c 
    | (a+b == 0) = True 
    | --etc. 
    | otherwise = False 

दूसरा है अगर बयान एक किसी और यदि अन्य भाषाओं में, या यह सिर्फ एक और यदि है के रूप में ही । मैं इसे पूर्व मानता हूं क्योंकि आपके पास केवल एक आउटपुट हो सकता है, लेकिन मैं बस यह सुनिश्चित करना चाहता हूं।

+0

हाँ, तर्क की आपकी रेखा सही रास्ते पर थी। "निष्पादित" एक से अधिक दाहिने तरफ होने का क्या अर्थ होगा? कोई साइड इफेक्ट्स नहीं हैं इसलिए हम जो कुछ भी करते हैं, उसे वापस करना होगा। हम किस मूल्य पर वापस आ जाएंगे? या हमें उन्हें गठबंधन करने का एक तरीका होगा ... हम किस तरह से उपयोग करेंगे? (हास्केल दर्शन के लिए आपको मार्गदर्शन करने के लिए केवल कुछ प्रश्न) – luqui

उत्तर

9

आपके द्वारा उपयोग किए जाने वाले निर्माण को गार्ड कहा जाता है। हास्केल एक विकल्प के बाद दिए गए विकल्पों को एक दूसरे के बाद जांचता है जब तक कि एक शर्त True उत्पन्न नहीं करती है। इसके बाद वह समीकरण के दायीं तरफ का मूल्यांकन करता है।

आप बहुत अच्छी तरह से

function n 
    | n == 1 = ... 
    | n == 2 = ... 
    | n >= 3 = ... 

इस प्रकार गार्ड प्रकार एक यदि का प्रतिनिधित्व करता है/अन्य भाषाओं से निर्माण elseif के लिख सकते हैं। के रूप में otherwise बस True के रूप में परिभाषित किया गया है, पिछले

| otherwise = 

हमेशा सच हो जाएगा और इसलिए एक कैच-ऑल else खंड प्रतिनिधित्व करता है।

फिर भी, हास्केल का सामान्य a = if foo then 23 else 42 कथन है।

+0

समझ में आता है, एसओ मुझे कब देता है स्वीकार करेगा। धन्यवाद! – switz

+2

ध्यान दें कि हास्केल में, 'if' कथन का 'else' हिस्सा अनिवार्य है। देखें [हास्केल 2010: कंडीशनर] (http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-320003.6)।और फिर वहां है ["कब" और "जब तक"] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Control-Monad.html#v:when) –

1

यह किसी और की तरह होना चाहिए।

नीचे पैटर्न otherwise वास्तव में केवल True है, इसलिए यदि पहला मैच जीत नहीं पाया गया है, तो आपको हमेशा अधिक विशिष्ट मूल्य और अन्यथा मूल्य मिल जाएगा।

2

आपके पास जो कुछ है वह वास्तव में एक कथन नहीं है, बल्कि एक गार्ड है। लेकिन आप सही हैं कि दूसरा मामला केवल "निष्पादित" हो जाता है अगर पिछले मामलों (यहां मामलों के माध्यम से मेरा मतलब है कि | और = के बीच अभिव्यक्तियां) मेल नहीं खातीं (True का मूल्यांकन करें)। otherwise सिर्फ True (जिस तरह से यह हमेशा "मेल खाता है) के लिए एक synonyme है।

1

सही। यद्यपि आपने गार्ड का उपयोग किया है, जिस तरह से आपने इसे व्यक्त किया है, वह if-statement का उपयोग करने के समान या कम है। नतीजे देने के लिए सशर्त परीक्षण का प्रवाह आपके गार्ड में सूचीबद्ध क्रम में लिखे गए गार्ड के माध्यम से गिर जाएगा।

(a+b == 0) 

पहले जाँच की जाएगी

etc. 

दूसरा जाँच की जाएगी और इसके आगे, कोई पूर्ववर्ती सशर्त सच है प्रदान की है।

otherwise 

अंतिम बार चेक किया जाएगा, बशर्ते कोई पिछली सशर्त सत्य न हो।

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