2011-12-03 14 views
9

इसका कोई खास कारण Contol.Concurent.STM पुस्तकालय में check समारोह टाइप Bool -> STM a है और नहीं बल्कि सफलता पर undefined रिटर्न तो प्रकार Bool -> STM() होने क्यों है? जिस प्रकार इसे टाइप चेकर लागू किया गया है, वह राजनीति को check foo के साथ समाप्त होने वाले डू ब्लॉक को संकलित करेगा, केवल *** Exception: Prelude.undefined के साथ रनटाइम पर विफल होने के लिए।हास्केल एसटीएम जांच समारोह अपरिभाषित को वापस लौटाती

+0

यह एक अच्छा सवाल है; ऐसा लगता है कि [एसटीएम इनवेरिएंट पेपर] में वर्णित 'चेक' (http://research.microsoft.com/en-us/um/people/simonpj/papers/stm/stm-invariants.pdf) को अब ' alwaysSucceeds'। यह मुझे स्पष्ट नहीं है कि मौजूदा 'चेक' क्या करता है। – acfoltzer

+0

हाँ, मुझे नहीं पता कि ऐसा करने का उद्देश्य क्या हो सकता है। किंडा अब उत्सुक है। –

+0

'चेक बी = यदि बी फिर अपरिभाषित है और फिर से प्रयास करें' मैं दावा करता हूं कि इसे पढ़ना चाहिए 'चेक बी = यदि बी फिर वापस लौटें() और फिर पुनः प्रयास करें –

उत्तर

5

ऐसा लगता है कि यह 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 को हमेशा के लिए कॉल करता है और लटकता प्रतीत होता है। बहुत बेहतर उदाहरणों के लिए पेपर देखें, लेकिन ध्यान रखें कि इसका प्रकाशन इसके बाद से बदल गया है।

+0

मैं समझता हूं कि चेक कैसे काम करता है। मुझे समझ में नहीं आ रहा है कि यह इस तरह से क्यों लिखा गया है कि 'सही जांचें >> = writeTVar t' प्रकार की जांच पास करेगा, लेकिन रनटाइम त्रुटि का कारण बनता है। मैं जोर देता हूं कि ऊपर दिए गए कोड को टाइप प्रकार में विफल होना चाहिए जब तक कि 't' बल्कि बेकार प्रकार 'टीवीर()' नहीं है। –

+0

अहह, मैंने सोचा कि सवाल दिशा में अधिक था, "अगर यह सब कोड है, तो क्या बात है?" मैं मानता हूं कि ऐसा लगता है कि प्रकार 'बूल -> एसटीएम() 'होना चाहिए। – acfoltzer

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