2013-02-05 14 views
36

तो वहाँ हास्केल में एक पुस्तकालय spoon मुझे इसहैस्केल में चम्मच असुरक्षित है?

safeHead :: [a] -> Maybe a 
safeHead = spoon . head 

करने की सुविधा देता है जो कहा जाता है, लेकिन यह भी मुझे इस

>>> spoon True    :: Maybe Bool 
Just True 
>>> spoon (error "fork") :: Maybe Bool 
Nothing 
>>> spoon undefined  :: Maybe Bool 
Nothing 
>>> spoon (let x = x in x) :: Maybe Bool 
<... let's just keep waiting...> 

जो कुछ मामलों में वास्तव में उपयोगी लगता है अपना काम करने दिया, लेकिन यह भी denotational अर्थ विज्ञान का उल्लंघन करती है (मेरी समझ के लिए) क्योंकि यह मुझे के अर्थपूर्ण preimage में विभिन्न चीजों के बीच अंतर करने देता है। यह throw/catch से सख्ती से अधिक शक्तिशाली है क्योंकि उनके पास निरंतरता द्वारा परिभाषित एक अर्थशास्त्र है।

>>> try $ return (error "thimble") :: IO (Either SomeException Bool) 
Right *** Exception: thimble 

तो मेरा सवाल है: क्या कोई व्यक्ति सुरक्षा प्रकार तोड़ने के लिए दुर्भावनापूर्ण रूप से चम्मच का उपयोग कर सकता है? क्या खतरे के लायक सुविधा है? या, वास्तव में, क्या कोई उचित तरीका है कि इसका उपयोग किसी प्रोग्राम के अर्थ में किसी के आत्मविश्वास को खराब कर सकता है?

+3

आप किस खतरे के बारे में बात करते हैं? वह एक शुद्धवादी डरावनी हो सकता है? –

+0

अच्छा सवाल, ऐसा लगता है कि यह वास्तव में उपयोगी हो सकता है। –

+9

@RobertHarvey किसी भी खतरे में नहीं हो सकता है, लेकिन कई बार आपको लगता है कि शुद्धता के उल्लंघन से मॉड्यूल encapsulation के आसपास व्यवहार या चाल के बारे में गलत उम्मीदों का कारण बनता है।मैं वास्तविक कोड में 'चम्मच' का उपयोग करने से खुश हूं (मैं पहले से ही करता हूं) लेकिन मैंने आज देखा कि यह हास्केल अर्थशास्त्र का उल्लंघन करता है। –

उत्तर

36

एक मुश्किल बिंदु है, जहां आप इसका उपयोग करते हैं, जो एक निर्दोष रिएक्टर की तरह दिखता है वह एक कार्यक्रम के व्यवहार को बदल सकता है।

f h x = h x 
isJust (spoon (f undefined)) --> True 

लेकिन शायद किताब में सबसे आम Haskell परिवर्तन कर रही है, ईटा संकुचन, f को, देता

f h = h 
isJust (spoon (f undefined)) --> False 

एटा संकुचन पहले से ही संरक्षण अर्थ विज्ञान नहीं है: किसी भी घंटियां और सीटियां के बिना, यह यह है seq के अस्तित्व के कारण; लेकिन बिना चम्मच ईटा संकुचन केवल एक समाप्ति कार्यक्रम को एक त्रुटि में बदल सकता है; चम्मच ईटा संकुचन के साथ एक समाप्ति कार्यक्रम को एक अलग टर्मिनल प्रोग्राम में बदल सकता है।

औपचारिक रूप से, spoon तरीका असुरक्षित है कि यह non-monotone on domains है (और इसलिए इसे इसके संदर्भ में परिभाषित किया जा सकता है); जबकि spoon के बिना हर समारोह मोनोटोन है। तो तकनीकी रूप से आप औपचारिक तर्क की उस उपयोगी संपत्ति को खो देते हैं।

रीड-लाइफ उदाहरण के साथ आना जब यह महत्वपूर्ण होगा पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है (पढ़ना: मुझे लगता है कि वास्तविक जीवन में कोई समस्या नहीं है - जब तक आप इसका दुरुपयोग करना शुरू करते हैं; उदाहरण के लिए undefined जिस तरह से जावा प्रोग्रामर null का उपयोग करते हैं)

+3

यह वही है जो मैं खोज रहा था। मैंने इसे गैर-monotonicity संपत्ति से कनेक्ट नहीं किया- इसका मतलब यह है कि इसका उपयोग करने के लिए अनुशासन का हिस्सा हमेशा 'कुछ भी नहीं' प्रतिक्रियाओं पर विचार करना चाहिए क्योंकि वे उपप्रणाली विफलताओं के प्रकार हैं। –

12

spoon के साथ, यदि आप यही प्राप्त कर रहे हैं, तो आप unsafeCoerce नहीं लिख सकते हैं। यह ठीक दिखता है जितना लगता है, और हास्केल सेमेन्टिक्स का उतना ही उल्लंघन करता है जितना लगता है। हालांकि, आप इसका उपयोग segfault या इस तरह के कुछ भी बनाने के लिए नहीं कर सकते हैं।

हालांकि, हास्केल अर्थशास्त्र का उल्लंघन करके, यह सामान्य रूप से सामान्य कारणों के लिए कोड को कठिन बनाता है, और उदाहरण के लिए, उदाहरण के लिए safeHead चम्मच के साथ सीधे safeHead की तुलना में कम कुशल होने जा रहा है।

+1

हां, यह जानकर कि 'असुरक्षित वाणिज्य' लिखने का कोई तरीका नहीं है, हालांकि यह बहुत चिंताजनक नहीं है। यह और भी है कि मैं जानना चाहता था कि मॉड्यूल सीमाओं का उल्लंघन करने का तरीका था या इसके माध्यम से। ऐसा कुछ जो आ सकता है और गलती से कम जानबूझकर दुर्भावनापूर्ण कोड गलत हो सकता है ... हालांकि मैंने यह लिखा था कि इस सवाल में, गाल में जीभ की तरह। –

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