오 친애하는.
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
의 정의를 보면, 당신은 그냥 볼 수 있습니다 프로그램에있을 수있는 setNumCapabilities
호출과 관련하여 평가 시점에 따라 달라집니다. 첫 번째 세션에서는 IO
이 처음 평가 될 때만 실행되므로 numCapabilities
은 일관성을 유지합니다. 그러나 인라인이있는 경우 (이름에 NOINLINE 또는 기타로 표시되지 않음) 사실이 아닐지라도 - 원칙적으로 두 번 발생하는 두 가지 값 (numCapabilities
)을 얻을 수 있습니다 (실제로는 만들지 못했지만 이것은 일어난다).
그래서 대답은
numCapabilities
하지 순수 기능이지만, 잘못
unsafePerformIO
의 악명 높은 뒷문으로 같은 표시되어 있다는 점이다.
이제 반대의 이유가 있습니다. 프로그램 실행 중에 getArgs의 값이 절대로 바뀌지 않기 때문에 왜 I/O가 필요한지 /해야하는지 정확히 알 수 없습니다. – sepp2k
답변 중 하나에서 언급했듯이, _pure_ 표현식을 정의하는 방법에 따라 다릅니다. 표현식 자체가 무엇이든 의존하지 않는다면 표현식을 _pure_로 정의 할 수 있습니다. 이 정의에 따르면'numCapabilities'는 순수하지 않으므로 'Int'유형을 갖는 것은 설계 결함으로 간주되어야합니다. Conal Elliott의 블로그 게시물 [Haskell의 순결 개념] (http://conal.net/blog/posts/notions-of-purity-in-haskell)에 관심이있을 수 있습니다. –
'numCapabilities'는'-N'에 주어진 값을 반환 할 필요가 없습니다. 단지'getNumCapabilities'를 호출하기 때문에, 그때 그때의 많은 능력을 돌려줍니다. 이 문제는 버그라고 생각합니다.하지만 GHC 모듈에서 무엇을 의지 할 수 있는지 보장하기 란 어렵습니다. –