इसका कोई खास कारण Contol.Concurent.STM
पुस्तकालय में check
समारोह टाइप Bool -> STM a
है और नहीं बल्कि सफलता पर undefined
रिटर्न तो प्रकार Bool -> STM()
होने क्यों है? जिस प्रकार इसे टाइप चेकर लागू किया गया है, वह राजनीति को check foo
के साथ समाप्त होने वाले डू ब्लॉक को संकलित करेगा, केवल *** Exception: Prelude.undefined
के साथ रनटाइम पर विफल होने के लिए।हास्केल एसटीएम जांच समारोह अपरिभाषित को वापस लौटाती
उत्तर
ऐसा लगता है कि यह GHC PrimOp के लिए प्लेसहोल्डर परिभाषा है, जैसे "परिभाषा" seq _ y = y
जो वास्तविक आदिम कार्यान्वयन कोड के साथ संकलक द्वारा प्रतिस्थापित किया जाता है। PrimOp implementation of check
एक अभिव्यक्ति लेता है और STM invariants paper में वर्णित इनवेंटरी की वैश्विक सूची में जोड़ता है। जहां दावे में नाकाम रहने का संकेत हो सकता है
import Control.Concurrent.STM
data LimitedTVar = LTVar { tvar :: TVar Int
, limit :: Int
}
newLimitedTVar :: Int -> STM LimitedTVar
newLimitedTVar lim = do
tv <- newTVar 0
return $ LTVar tv lim
incrLimitedTVar :: LimitedTVar -> STM()
incrLimitedTVar (LTVar tv lim) = do
val <- readTVar $ tv
let val' = val + 1
check (val' <= lim)
writeTVar tv val'
test :: STM()
test = do
ltv <- newLimitedTVar 2
incrLimitedTVar ltv -- should work
incrLimitedTVar ltv -- should work still
incrLimitedTVar ltv -- should fail; we broke the invariant
वास्तविक, इस साझा राज्य पर अपरिवर्तनशीलताओं बात पर जोर देना उपयोगी होगा:
यहाँ check
के नए प्रकार फिट करने के लिए एक सुपर काल्पनिक उदाहरण है कि कागज से संशोधित किया है एक अस्थायी असंगतता। फिर आप अंततः उस आविष्कार को फिर से सच होने की उम्मीद के साथ पुनः प्रयास करना चाहते हैं, लेकिन चूंकि यह उदाहरण स्थायी रूप से आविष्कार को तोड़ता है, यह केवल retry
को हमेशा के लिए कॉल करता है और लटकता प्रतीत होता है। बहुत बेहतर उदाहरणों के लिए पेपर देखें, लेकिन ध्यान रखें कि इसका प्रकाशन इसके बाद से बदल गया है।
मैं समझता हूं कि चेक कैसे काम करता है। मुझे समझ में नहीं आ रहा है कि यह इस तरह से क्यों लिखा गया है कि 'सही जांचें >> = writeTVar t' प्रकार की जांच पास करेगा, लेकिन रनटाइम त्रुटि का कारण बनता है। मैं जोर देता हूं कि ऊपर दिए गए कोड को टाइप प्रकार में विफल होना चाहिए जब तक कि 't' बल्कि बेकार प्रकार 'टीवीर()' नहीं है। –
अहह, मैंने सोचा कि सवाल दिशा में अधिक था, "अगर यह सब कोड है, तो क्या बात है?" मैं मानता हूं कि ऐसा लगता है कि प्रकार 'बूल -> एसटीएम() 'होना चाहिए। – acfoltzer
- 1. हास्केल समारोह समारोह कॉल
- 2. जावास्क्रिप्ट अपरिभाषित जांच
- 3. एसटीएम
- 4. अपरिभाषित समारोह mysql_connect()
- 5. अपरिभाषित वैरिएबल, हास्केल
- 6. सिद्धांत अपरिभाषित समारोह apc_fetch
- 7. अपरिभाषित समारोह SHA256()
- 8. पीएचपी fileinfo अपरिभाषित समारोह
- 9. अपरिभाषित समारोह curl_init()
- 10. हास्केल नौसिखिया: मानचित्र समारोह
- 11. हास्केल समारोह रचना सवाल
- 12. एसटीएम 32
- 13. एसटीएम मोनड समस्या
- 14. हास्केल - सरल निर्माता तुलना समारोह
- 15. हास्केल में जेनेरिक समारोह रचना
- 16. jQuery स्क्रिप्ट: समारोह (खिड़की, दस्तावेज़, अपरिभाषित) बनाम, (समारोह ($, खिड़की, दस्तावेज़, अपरिभाषित)
- 17. सामान्य लिस्प, अपरिभाषित चौराहे समारोह व्यवहार?
- 18. हास्केल में नक्शा समारोह के सी # बराबर हास्केल में
- 19. एसटीएम और डाटाबेस लेनदेन का एक साथ
- 20. हास्केल: प्रकार निष्कर्ष और समारोह रचना
- 21. हास्केल और शुद्ध समारोह के Memoization परिणाम
- 22. कॉलिंग हास्केल FFI समारोह Ptrs सी
- 23. "संभाल" समारोह और असली दुनिया हास्केल
- 24. हास्केल
- 25. लाइफटाइम शाब्दिक एक समारोह से वापस लौटे
- 26. पीएचपी: अपरिभाषित समारोह gzdecode() पर की गई कॉल
- 27. एएसपी.नेट एमवीसी एक फाइल कैसे लौटाती है?
- 28. हास्केल
- 29. हास्केल
- 30. अपरिभाषित, typeof अपरिभाषित, hasOwnProperty
यह एक अच्छा सवाल है; ऐसा लगता है कि [एसटीएम इनवेरिएंट पेपर] में वर्णित 'चेक' (http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/stm-invariants.pdf) को अब ' alwaysSucceeds'। यह मुझे स्पष्ट नहीं है कि मौजूदा 'चेक' क्या करता है। – acfoltzer
हाँ, मुझे नहीं पता कि ऐसा करने का उद्देश्य क्या हो सकता है। किंडा अब उत्सुक है। –
'चेक बी = यदि बी फिर अपरिभाषित है और फिर से प्रयास करें' मैं दावा करता हूं कि इसे पढ़ना चाहिए 'चेक बी = यदि बी फिर वापस लौटें() और फिर पुनः प्रयास करें –