ああ親愛。
numCapabilities :: Int
numCapabilities = unsafePerformIO $ getNumCapabilities
と、次のGHCiのセッションは、問題を示します: - numCapabilities
の値
[[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
の定義を見れば、あなたはそれだけで見ることができますプログラムに存在する可能性のある呼び出しについて評価される時点によって異なります。最初のセッションでは、IO
が最初に評価されたときにのみ実行されるため、numCapabilities
は一貫していました。しかし、実際にはないかもしれないにもかかわらず、インライン展開(名前にNOINLINEなどの印がついていません)がある場合、原則としてnumCapabilities
の2回の出現から2つの異なる値を得ることができます(実際には、これが起こる)。
だから、答えはnumCapabilities
は、純粋な機能ではなく、誤ってunsafePerformIO
の悪名高いバックドアでそのようにマークされていることです。
私は現在、プログラムの実行中に 'getArgs'の値が決して変更されないので、' IO'にする必要がある/なぜそうであるべきか正確にはわかりません。 – sepp2k
答えの1つで述べたように、どのように_pure_式を定義するかによって異なります。私はそれが表現そのもの以外のものに依存していない場合、式を_pure_と定義します。この定義によって、 'numCapabilities'は純粋ではないので、' Int'の型は設計上の欠陥とみなされるべきです。 Conal Elliottのブログ記事「Haskellにおける純度の概念」(http://conal.net/blog/posts/notions-of-purity-in-haskell)に興味があるかもしれません。 –
'numCapabilities'は' -N'に与えられた値を返す必要はありません。単に 'getNumCapabilities'を呼び出します。私はこれをバグと考えていますが、あなたがGHCモジュールに頼ることができる保証については言い難いです。 –