2011-05-11 15 views
8

मान लीजिए मैं की तरह एक haskell अभिव्यक्ति है मिलान:हास्केल पैटर्न सममित मामलों

foo (Nothing, Just a) = bar a 
foo (Just a, Nothing) = bar a 

वहाँ उन मामलों संक्षिप्त करने के लिए किसी भी Haskell वाक्य रचना है, तो मैं या तो आकार से मिलान और दोनों के लिए प्रतिक्रिया के रूप में bar a निर्दिष्ट कर सकते हैं? या यह उतना ही संक्षिप्त है जितना मैं इसे प्राप्त कर सकता हूं?

+0

भी देखें http://stackoverflow.com/questions/5914965/patterns-for-symmetric-functions – kennytm

उत्तर

5

यह उतना ही संक्षिप्त है जितना कि यह हास्केल में मिलता है। एमएल में आप जो चाहते हैं उसके लिए एक वाक्यविन्यास है (कई पैटर्न लिखकर, जो एक ही चर को बांधते हैं, एक दूसरे के बगल में | द्वारा अंतिम पैटर्न के बाद शरीर के साथ अलग), लेकिन हास्केल में नहीं है।

8

यदि आपका कोड अपने उदाहरण से अधिक जटिल है, तो आप कुछ इस तरह करते हैं, Maybe के लिए Alternative उदाहरण और PatternGuards विस्तार (Haskell2010 का हिस्सा) का उपयोग कर सकते हैं।

{-# LANGUAGE PatternGuards #-} 
import Control.Applicative 

foo (x, y) | Just a <- y <|> x = bar a 

मामले में आप इसे से परिचित नहीं हैं, <|> उठाता सबसे बाईं ओर Just अगर वहाँ एक है और Nothing रिटर्न अन्यथा, पैटर्न गार्ड को विफल कर रही।

+2

एक महत्वपूर्ण चेतावनी है, हालांकि - यह अधिक मामलों मूल की तुलना में से मेल खाता है कोड। foo (Just x, Just y) मिलान किया जाएगा, इसलिए यदि आप ऐसा नहीं चाहते हैं तो आपको इसे पहले के मामले में संभालना सुनिश्चित करना होगा। – mokus

4

आप अपने दो मामलों को एक पैटर्न में पतन करने के लिए मनमानी कार्यों को जोड़ने के लिए -XViewPatterns का उपयोग कर सकते हैं।

foo (p -> (Just a, Nothing)) = bar a 

बहुत सरल: आपका पैटर्न अब एक समारोह p कि बात आप मिलान कराना चाहते पैदावार है!

हम के रूप में, हालांकि p परिभाषित करने के लिए है:

p (Nothing, [email protected](Just _)) = (a, Nothing) 
p [email protected](Just _, Nothing) = a 
p a      = a 

या फिर भी आप को देखने से पहले डेटा को सामान्य करना चाहते हैं।


संदर्भ:GHC User's Guide chapter on View Patterns

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