哦親愛的。如果你看看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
僅在首次評估時執行。但是,如果有內聯(名稱沒有標記NOINLINE或任何其他名稱),即使這可能不是真的 - 原則上可以從兩個出現的numCapabilities
中獲得兩個不同的值(儘管在實踐中我無法做到這發生)。
所以答案是numCapabilities
不是純函數,而是由unsafePerformIO
臭名昭著的後門被錯誤地標註。
我現在想恰恰相反:由於getArgs'的'值你的程序的運行過程中不會改變,我不知道是什麼原因,它需要/應該是'IO'。 – sepp2k 2012-08-07 17:31:59
正如其中一個答案所述,它取決於如何定義_pure_表達式。我將表達式定義爲_pure_,如果它不依賴於任何東西,除了表達式本身。按照這個定義'numCapabilities'不是純粹的,所以有一個'Int'類型應該被認爲是一個設計缺陷。您可能會對Conal Elliott的博客文章[Haskell純度概念]感興趣(http://conal.net/blog/posts/notions-of-purity-in-haskell)。 – 2012-08-07 18:05:12
'numCapabilities'不需要返回賦給'-N'的值 - 它只是調用'getNumCapabilities',因此返回當時的許多功能。我認爲這是一個錯誤,但是很難說在GHC模塊中可以依靠什麼保證。 – 2012-08-18 21:56:20