Giả sử tôi đã hai F # chức năng:Làm cách nào để biết chức năng F # có thuần túy không?
let sq x = x*x
let tm = DateTime.Now
SQ Rõ ràng là tinh khiết ở chỗ nó sẽ luôn luôn trả về giá trị tương tự cho một đầu vào cho trước khi tm là không tinh khiết bởi vì nó sẽ trả về một giá trị khác nhau mỗi lần nó được gọi là .
Nói chung có cách nào để xác định xem một hàm cụ thể trong F # là thuần túy hay không tinh khiết mà không phân tích những gì nó làm, nói cách khác đọc nó theo từng dòng?
Ngoài ra, có cách nào để chú thích một hàm để báo cho trình biên dịch biết rằng hàm này là thuần khiết hay không tinh khiết khi bạn viết nó?
Cuối cùng khi gọi một hàm là một phần của thời gian chạy ngôn ngữ chung (chẳng hạn như DateTime), làm thế nào người ta có thể biết nó là tinh khiết hay không tinh khiết mà không thử nó?
Lưu ý: do "tinh khiết" Ý tôi là định nghĩa từ Wikipedia: http://en.wikipedia.org/wiki/Pure_function (permalink)
Trong lập trình máy tính, một chức năng có thể được mô tả như tinh khiết nếu cả hai các báo cáo về chức năng giữ:
Hàm luôn đánh giá cùng một giá trị kết quả cho cùng một đối số giá trị. Giá trị kết quả của hàm không thể phụ thuộc vào bất kỳ thông tin ẩn hoặc trạng thái nào có thể thay đổi khi thực hiện chương trình số tiền thu được hoặc giữa các lần thực thi khác nhau của chương trình.
Đánh giá kết quả không gây ra bất kỳ hiệu ứng hoặc đầu ra nào có thể quan sát được , chẳng hạn như đột biến đối tượng có thể thay đổi hoặc xuất ra thiết bị I/O.
Khi bạn nói thuần khiết, bạn có thực sự ngụ ý idempotent? Hay bạn có nghĩa là nó không gây ra tác dụng phụ nào? –
Ah, vì vậy Wikipedia nói cả hai. Đủ công bằng.FWIW, tôi không nghĩ Microsoft cung cấp bất kỳ loại chú thích hoặc thuộc tính nào đánh dấu các chức năng là "thuần khiết ..." Bạn chỉ cần biết. –
Bạn cũng có thể tìm thấy câu trả lời cho câu hỏi này http://stackoverflow.com/questions/4391524/is-returning-a-random-value-from-function-a-side-effect đọc có giá trị. –