2012-06-08 11 views
7

क्या हास्केल में निम्न जैसे फ़ंक्शन को परिभाषित करने के लिए वैसे भी है?हास्केल: गैर-सख्त बूलियन ऑपरेशंस

or True  True  = True 
or True  undefined = True 
or True  False  = True 
or undefined True  = True 
or undefined False  = undefined 
or undefined undefined = undefined 
or False  True  = True 
or False  undefined = undefined 
or False  False  = False 

मैं क्या वर्तमान में इसके लिए एक उपयोग के मामले नहीं (हालांकि मैं एक में रुचि हो जाएगा), मैं सिर्फ रुचि है, तो यह संभव है हूँ।

+0

क्या यह आलसी मूल्यांकन या तीन मूल्यवान तर्क की आपकी हैकेल व्याख्या है? –

+4

'अपरिभाषित' एक मान नहीं है; यह एक मूल्य की अनुपस्थिति है। इसलिए, आप "यह जांच नहीं सकते कि यह अनिर्धारित है या नहीं", इसलिए आपको चुनना होगा: संख्या 1, 6 और 8 या संख्या 4, 5, 6; आप दोनों नहीं हो सकता है। भूत के साथ बॉक्स के लिए – dflemstr

उत्तर

12

आपके मूल्यांकन आदेश (जिस क्रम में आप मूल्यों का निरीक्षण) यदि आप एक आलसी संस्करण लिख सकें पर निर्भर करता है:

Prelude> True || undefined 
True 
Prelude> undefined || True 
*** Exception: Prelude.undefined 

Prelude> :t or 
or :: [Bool] -> Bool 

Prelude> or [True, undefined] 
True 

वास्तव में, हास्केल में डिफ़ॉल्ट परिभाषा, इस तरह व्यवहार करेगा के बाद से हास्केल एक आलसी है भाषा।

हालांकि, पहले मान को देखे बिना, एक अनिर्धारित मूल्य "छोड़ने" का कोई तरीका नहीं है, जो इसे नीचे मूल्यांकन करेगा, जिससे आपकी अभिव्यक्ति को अपरिभाषित किया जा सकता है।

enter image description here

आप बॉक्स के अंदर देखो, तो एक भूत आपको मिल सकता है:

कि आलसी मूल्यों याद उन्हें अंदर भूत के साथ प्रस्तुत करता है।

यदि बोतलों की जांच करना महत्वपूर्ण है (उदाहरण के लिए टेस्टाइट के हिस्से के रूप में) आप उन्हें अपवाद, and intercept them के रूप में देख सकते हैं। लेकिन आप इसे शुद्ध कार्य में नहीं करेंगे।

+2

+1 ;-) और उत्तर के लिए भी – epsilonhalbe

+1

संदर्भ के लिए, भूत के साथ बॉक्स एडवर्ड यांग की अत्यधिक अनुशंसित ब्लॉग पोस्ट http://blog.ezyang.com/2011/04/the से आता है -हास्केल-हीप/ –

15

मानक हास्केल में यह संभव नहीं है, लेकिन कोनाल इलियट द्वारा lub लाइब्रेरी में लागू एक असुरक्षित चाल के साथ किया जा सकता है।

मूल रूप से, आप दो कार्यों लिखें:

orL True _ = True 
orL False x = x 

orR = flip orL 

और फिर आप or a b परिभाषित कर सकते हैं होने के लिए lub (कम से कम ऊपरी "definedness" आदेश के संबंध में बाउंड) orL a b और orR a b की।

परिचालन रूप से, यह समानांतर में दोनों गणनाओं को चलाता है और दूसरे को चुनता है, जो दूसरे को मारता है।

भले ही आपके द्वारा प्रस्तावित कार्य करता है, लेकिन इसके पास महत्वपूर्ण नुकसान हैं। सबसे पहले, lub केवल तभी सुरक्षित है जब इसके तर्क सहमत हैं (नीचे तक बराबर)। यदि आप lub True False लेते हैं, तो परिणाम गैर-निर्धारक होगा, इस प्रकार शुद्धता का उल्लंघन होगा! दूसरा, समानांतर में दोनों कंप्यूटेशंस चलाने का प्रदर्शन ओवरहेड कुछ स्थितियों में हावी हो सकता है (उदाहरण के लिए, एक बड़ी सूची के foldr or False की गणना करने का प्रयास करें!)।

+0

क्यों 'लब ट्रू फाल्स' गैर-निर्धारक होगा? सहजता से, इसे 'अपरिभाषित' वापस करना चाहिए। –

+0

@EarthEngine, क्योंकि यह परिभाषा क्रम में monotonic नहीं है और इसलिए लागू करना असंभव है। विशेष रूप से, 'एफ गलत' को 'एफ अपरिभाषित 'से कम परिभाषित करने की अनुमति नहीं है। यदि आप 'f = lub True' लेते हैं, तो आपको अपना उदाहरण मिलता है। – Rotsor

+0

तो क्या यह 'लब' लिखना संभव है :: बूल -> बूल -> शायद बूल 'जैसे कि' लब 'ट्रू फाल्स == कुछ भी नहीं? –

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