Trong thư viện đồng thời GHC.Conc, có một hàm gọi là numCapabilities
. Loại của nó là numCapabilities :: Int
và nó thực sự trả lại một số bạn đã vượt qua bằng cờ dòng lệnh (ví dụ: 5
nếu các tùy chọn là +RTS -N 5
).Tại sao numCapabilities là một hàm thuần túy?
Tuy nhiên, getArgs
(loại: IO [String]
) về cơ bản giống nhau (nó trả về các đối số không có thời gian không được phân bổ) nhưng không phải là hàm thuần túy.
Nếu lý do duy nhất là numCapabilities
thường là cần thiết trong mã thuần túy, theo cách nào không phải là các tùy chọn dòng lệnh khác không cần trong mã thuần túy?
Tôi có thiếu gì đó hoặc hoặc là numCapabilities
một lỗi thiết kế hoặc tôi có được phép viết con quái vật sau đây không?
myGetArgs = unsafePerformIO getArgs
Bây giờ tôi tự hỏi ngược lại: Vì giá trị của 'getArgs' không bao giờ thay đổi trong khi chạy chương trình của bạn, tôi không chắc chắn lý do tại sao cần phải/trong' IO'. – sepp2k
Như đã đề cập trong một trong các câu trả lời, nó phụ thuộc vào cách một định nghĩa biểu thức _pure_. Tôi muốn định nghĩa một biểu thức là _pure_ iff nó không phụ thuộc vào bất cứ điều gì ngoài biểu thức chính nó. Theo định nghĩa này, 'numCapabilities' không thuần túy, do đó, có một loại' Int' nên được coi là một lỗ hổng thiết kế. Bạn có thể quan tâm đến bài đăng trên blog của Conal Elliott [Khái niệm về sự thuần khiết trong Haskell] (http://conal.net/blog/posts/notions-of-purity-in-haskell). –
'numCapabilities' không cần trả lại giá trị cho' -N' - nó chỉ gọi 'getNumCapabilities', do đó trả về tuy nhiên nhiều khả năng có lúc đó. Tôi nghĩ rằng đây là một lỗi, thực sự, nhưng thật khó để nói những gì đảm bảo bạn có thể dựa vào trong các mô-đun GHC. –