EDIT: Cảm ơn @interjay và @Antal Spector-Zabusky vì đã giải thích lý do tại sao câu trả lời này bị từ chối. Họ viết
Các tài liệu là một chút sai lệch. Các giá trị được mã hóa cứng vào trình biên dịch GHC. Sau 48 năm bạn chắc chắn biết rằng mã thực tế luôn vượt qua tài liệu. - interjay ngày hôm qua @ andy256 Bạn hoàn toàn đúng khi tài liệu đó tệ (thực sự, đó là một phần lý do tại sao Francisco hỏi câu hỏi này ngay từ đầu), và sự nhầm lẫn của bạn là điều dễ hiểu. Vấn đề của Haskell là nếu các giá trị Chuỗi đó có thể thay đổi trong thời gian chạy, thì đó sẽ là một lỗi nghiêm trọng - các biến không được phép thay đổi. Đây là tầm quan trọng của hàm tạo kiểu IO - nó đại diện cho một tính toán được phép truy cập vào "thế giới bên ngoài", và do đó, một kết quả có thể thay đổi. Thực hiện cuộc gọi hệ thống là một ví dụ tốt về hành động IO. Tiết [1/2] - Antal Spector-Zabusky 9 giờ trước @ andy256 Mạnh (Một hành động IO khác có thể là "cập nhật bộ đếm toàn cầu".) Vì vậy, khi chúng tôi thấy một Chuỗi, chúng tôi biết rằng nó không thể thực hiện bất kỳ giao tiếp nào với HĐH dưới mui xe. Đây là lý do tại sao, có lẽ đáng ngạc nhiên nếu bạn không quen với Haskell, sẽ không dễ thực hiện os :: String để thực hiện cuộc gọi hệ thống - mọi giá trị như vậy đều không thể thực hiện được trong Haskell cơ bản, sẽ vi phạm mọi kỳ vọng của lập trình viên về cách các chương trình làm việc và thậm chí có khả năng tăng tốc trình biên dịch và trình tối ưu hóa (không phải là vấn đề lý thuyết - có câu trả lời Stack Overflow nơi mọi người gặp vấn đề tương tự). [2/2] - Antal Spector-Zabusky Đây là lý do tại sao, có lẽ đáng ngạc nhiên nếu bạn không quen với Haskell, sẽ không dễ thực hiện os :: String để thực hiện cuộc gọi hệ thống - mọi giá trị như vậy đều không thể thực hiện được trong Haskell cơ bản, sẽ vi phạm mọi kỳ vọng của lập trình viên về cách các chương trình làm việc và thậm chí có khả năng tăng tốc trình biên dịch và trình tối ưu hóa (không phải là vấn đề lý thuyết - có câu trả lời Stack Overflow nơi mọi người gặp vấn đề tương tự). [2/2] - Antal Spector-Zabusky Đây là lý do tại sao, có lẽ đáng ngạc nhiên nếu bạn không quen với Haskell, sẽ không dễ thực hiện os :: String để thực hiện cuộc gọi hệ thống - mọi giá trị như vậy đều không thể thực hiện được trong Haskell cơ bản, sẽ vi phạm mọi kỳ vọng của lập trình viên về cách các chương trình làm việc và thậm chí có khả năng tăng tốc trình biên dịch và trình tối ưu hóa (không phải là vấn đề lý thuyết - có câu trả lời Stack Overflow nơi mọi người gặp vấn đề tương tự). [2/2] - Antal Spector-Zabusky và thậm chí có khả năng tăng trình biên dịch và trình tối ưu hóa (không phải là vấn đề lý thuyết - có câu trả lời Stack Overflow nơi mọi người gặp vấn đề tương tự). [2/2] - Antal Spector-Zabusky và thậm chí có khả năng tăng tốc trình biên dịch và trình tối ưu hóa (không phải là vấn đề lý thuyết - có câu trả lời Stack Overflow nơi mọi người gặp vấn đề tương tự). [2/2] - Antal Spector-Zabusky
Nó hiện có hai phiếu xóa. Tôi sẽ để quá trình đó diễn ra, nhưng đề nghị nó thực sự có giá trị. Bên cạnh đó, những lời giải thích của họ cho thấy câu hỏi rất yếu và câu trả lời cũng vậy, vì một người mới chơi Haskell có thể dễ dàng làm theo lý do mà tôi đã làm.
Câu trả lời gốc:
Tôi không phải là lập trình viên Haskell, nhưng hai câu trả lời đã được đưa ra không khớp với tài liệu mà OP liên kết.
Giải thích của tôi về các tài liệu sau đây.
os :: String
- Điều này cung cấp cho bạn "Hệ điều hành mà chương trình đang chạy."
Tôi hy vọng rằng điều này sẽ đưa ra một cuộc gọi hệ thống để có được thông tin. Bởi vì hệ thống mà chương trình được biên dịch có thể khác với hệ thống mà nó chạy trên nó không thể là một giá trị được chèn bởi trình biên dịch. Nếu mã đang được diễn giải thì trình thông dịch có thể cung cấp kết quả, phải được lấy thông qua một cuộc gọi hệ thống.
arch :: String
- Điều này cung cấp cho bạn "Kiến trúc máy mà chương trình đang chạy."
Một lần nữa, tôi hy vọng rằng điều này sẽ đưa ra một cuộc gọi hệ thống để có được thông tin. Bởi vì hệ thống mà chương trình được biên dịch có thể khác với hệ thống mà nó chạy trên nó không thể là một giá trị được chèn bởi trình biên dịch.
compilerName :: String
- Điều này mang đến cho bạn "Việc triển khai Haskell mà chương trình được biên dịch hoặc đang được diễn giải."
Giá trị này chắc chắn được chèn bởi trình biên dịch / trình thông dịch.
compilerVersion :: String
- Điều này mang đến cho bạn "Phiên bản compilerName
mà chương trình được biên dịch hoặc đang được diễn giải."
Giá trị này chắc chắn được chèn bởi trình biên dịch / trình thông dịch.
Mặc dù bạn có thể xem xét hai cuộc gọi đầu tiên để có được đầu vào, kết quả đến từ các giá trị được giữ bởi Hệ điều hành. I / O thường đề cập đến truy cập lưu trữ thứ cấp.
IO
trong đó, thì có một trình bao bọcuname(3)
có sẵn trên Hackage: hackage.haskell.org/package/bindings-uname