2012-08-07 8 views
21

समवर्ती पुस्तकालय में जीएचसी.कॉन्क एक समारोह है जिसे numCapabilities कहा जाता है। इसका प्रकार numCapabilities :: Int है और यह वास्तव में कमांड लाइन ध्वज द्वारा पारित कुछ संख्या देता है (उदा। 5 यदि विकल्प +RTS -N 5 हैं)।numCapabilities एक शुद्ध फ़ंक्शन क्यों है?

हालांकि, getArgs (प्रकार: IO [String]) अनिवार्य रूप से वही है (यह अनपेक्षित गैर-रनटाइम तर्क देता है) लेकिन यह शुद्ध कार्य नहीं है।

यदि केवल एक ही बहाना है कि numCapabilities अक्सर शुद्ध कोड में आवश्यक है, तो अन्य कमांड लाइन विकल्प नहीं शुद्ध कोड में आवश्यक नहीं है?

क्या मुझे कुछ याद आ रही है या numCapabilities एक डिज़ाइन दोष है या क्या मुझे निम्नलिखित राक्षस लिखने की अनुमति है?

myGetArgs = unsafePerformIO getArgs 
+6

अब मैं इसके विपरीत सोच रहा हूं: चूंकि 'getArgs' का मान कभी भी आपके प्रोग्राम के दौरान नहीं बदलता है, इसलिए मुझे बिल्कुल यकीन नहीं है कि इसे' आईओ 'में क्यों होना चाहिए/होना चाहिए। – sepp2k

+4

जैसा कि उत्तर में से एक में बताया गया है, यह इस बात पर निर्भर करता है कि कोई _pure_ अभिव्यक्ति को कैसे परिभाषित करता है। मैं _pure_ होने के लिए एक अभिव्यक्ति को परिभाषित करता हूं अगर यह अभिव्यक्ति के अलावा कुछ भी निर्भर नहीं करता है। इस परिभाषा के अनुसार 'numCapabilities' शुद्ध नहीं है, इसलिए एक प्रकार का 'Int' एक डिज़ाइन दोष के रूप में माना जाना चाहिए। आपको कोनल इलियट के ब्लॉग पोस्ट [हास्केल में शुद्धता के विचार] में रुचि हो सकती है (http://conal.net/blog/posts/notions-of-purity-in-haskell)। –

+0

'numCapabilities' को '-N' को दिए गए मान को वापस नहीं करने की आवश्यकता है - यह केवल' getNumCapabilities 'कहता है, इसलिए उस समय कई क्षमताएं लौटाती हैं। मैं इसके बारे में एक बग के रूप में सोचता हूं, वास्तव में, लेकिन यह कहना मुश्किल है कि आप जीएचसी मॉड्यूल में क्या गारंटी दे सकते हैं। –

उत्तर

21

मैं बहुत क्या इस तरह की स्थितियों में क्या करना पर देखा गया बदलती देखा है। कुछ सोचते हैं कि संकलन के बीच भिन्न हो सकते हैं जो मान भिन्न नहीं हो सकते हैं, और कुछ सोचते हैं कि जब तक आपके प्रोग्राम के स्थानीय रन-टाइम के दौरान कोई मान नहीं बदलता है (यानी कुछ "कॉन्फ़िगरेशन" को "सेट अप" किया गया है main), यह शुद्ध होना चाहिए।

base पैकेज मध्य-मैदान पर बस गया है। numCapabilities (जहां तक ​​मुझे पता है) रन-टाइम के दौरान बदल जाएगा, लेकिन getArgs हो सकता है।

ऐसा इसलिए है क्योंकि withArgs फ़ंक्शन है जो आपको getArgs के माध्यम से प्राप्त तर्कों को बदलता है। तो, वह जवाब देता है।

+1

[' setNumCapabilities'] के बारे में क्या है (http: // www .haskell.org/GHC/docs/नवीनतम/html/पुस्तकालयों/आधार/GHC-Conc.html # v: setNumCapabilities)? –

+9

'numCapabilities'' पैरामीटर को '-N #' पर लौटाता है, जबकि 'getNumCapabilities' वास्तव में कितनी क्षमताएं देता है। 'setNumCapabilities' वास्तविक संख्या को बदलता है, जिसे 'getNumCapabilities' द्वारा पुनर्प्राप्त किया जाता है। 'I *' और 'set *' दोनों कार्य 'आईओ' मोनैड में हैं। – dflemstr

+0

जो सवाल उठाता है कि 'numCapabilities' और 'getNumCapabilities 'दोनों क्यों नहीं हैं और' args' और' getArgs' – helami

3

मैं कहूंगा कि यह एक गलती है, लेकिन यह इस बात पर निर्भर करता है कि शुद्धता क्या सोचती है। Notions of purity in Haskell और इसकी चर्चा पोस्ट देखें। सीधे शब्दों में कहें, पोस्ट का तर्क यह है कि प्रकारों का अर्थ है, और Int के अर्थ में numCapabilities जैसे कुछ के लिए कमरा नहीं है, जो निष्पादन-संदर्भ-निर्भर है।

15

ओह प्रिय। आप numCapabilities की परिभाषा को देखें, तो आप देख सकते हैं कि यह सिर्फ है:

numCapabilities :: Int 
numCapabilities = unsafePerformIO $ getNumCapabilities 

और निम्नलिखित GHCi सत्र समस्या को वर्णन:

[[email protected] ~]$ ghci 
GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help 
Loading [...] 
ghci> :m +GHC.Conc 
ghci> numCapabilities 
1 
ghci> setNumCapabilities 2 
ghci> numCapabilities 
1 
ghci> :q 
Leaving GHCi. 

[[email protected] ~]$ ghci 
GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help 
Loading [...] 
ghci> :m +GHC.Conc 
ghci> setNumCapabilities 2 
ghci> numCapabilities 
2 

यह निश्चित रूप से बुरा है - numCapabilities का मूल्य इस पर निर्भर करता है कि आपके प्रोग्राम में मौजूद setNumCapabilities कॉल के संबंध में इसका मूल्यांकन कब किया जाता है। ध्यान दें कि पहले सत्र में, numCapabilities लगातार बना रहा, क्योंकि IO केवल पहली बार मूल्यांकन किया जाता है जब इसका मूल्यांकन किया जाता है। हालांकि, इनलाइनिंग की उपस्थिति में (नाम को नोइनलाइन या कुछ भी चिह्नित नहीं किया गया है) यहां तक ​​कि यह सच भी नहीं हो सकता है - आप सिद्धांत रूप से numCapabilities की दो घटनाओं से दो अलग-अलग मान प्राप्त कर सकते हैं (हालांकि व्यवहार में मैं नहीं कर पा रहा हूं यह होता है)।

तो जवाब है कि numCapabilitiesनहीं एक शुद्ध समारोह है, लेकिन ग़लती से unsafePerformIO के कुख्यात पिछले दरवाज़े से इस तरह के रूप में चिह्नित किया गया है।

0

numCapabilitiesgetNumCapabilities का प्रारंभिक मान देता है, गीला या आरटीएस-एन ध्वज तर्क मौजूद नहीं है, इसलिए प्रकार समान होना चाहिए।

क्या आपने इसे अपने कंप्यूटर अधिकतम से अधिक संख्या के साथ करने की कोशिश की है। एक साथ धागे?

$ ghci +RTS -N99 
GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help 
Prelude> :m +GHC.Conc 
Prelude GHC.Conc> numCapabilities 
99 
Prelude GHC.Conc> getNumCapabilities 
99 !!! 
संबंधित मुद्दे