Tôi biết rằng khái niệm bất biến tồn tại trên nhiều mô hình lập trình. Ví dụ, bất biến vòng lặp có liên quan trong OO, lập trình chức năng và thủ tục.
Tuy nhiên, một loại rất hữu ích được tìm thấy trong OOP là bất biến dữ liệu của một loại cụ thể. Đây là những gì tôi gọi là "bất biến dựa trên kiểu" trong tiêu đề. Ví dụ, một Fraction
loại có thể có a numerator
và denominator
, với bất biến là gcd của chúng luôn là 1 (tức là phân số ở dạng rút gọn). Tôi chỉ có thể đảm bảo điều này bằng cách đóng gói một số loại, không để dữ liệu của nó được đặt tự do. Đổi lại, tôi không bao giờ phải kiểm tra xem nó có giảm hay không, vì vậy tôi có thể đơn giản hóa các thuật toán như kiểm tra đẳng thức.
Mặt khác, nếu tôi chỉ đơn giản khai báo một Fraction
loại mà không cung cấp bảo đảm này thông qua đóng gói, tôi không thể viết bất kỳ chức năng nào trên loại này mà giả sử rằng phân số bị giảm, vì trong tương lai ai đó có thể đi cùng và thêm một cách về việc nắm giữ một phần không giảm.
Nói chung, việc thiếu loại bất biến này có thể dẫn đến:
- Các thuật toán phức tạp hơn vì các điều kiện trước cần phải được kiểm tra / đảm bảo ở nhiều nơi
- Vi phạm DRY vì các điều kiện trước lặp đi lặp lại này thể hiện cùng một kiến thức cơ bản (rằng bất biến phải là đúng)
- Phải thực thi các điều kiện trước thông qua các lỗi thời gian chạy thay vì đảm bảo thời gian biên dịch
Vì vậy, câu hỏi của tôi là câu trả lời lập trình chức năng cho loại bất biến này là gì. Có một cách thành ngữ chức năng để đạt được ít nhiều cùng một điều? Hoặc có một số khía cạnh của lập trình chức năng làm cho lợi ích ít liên quan?
PrimeNumber
lớp học. Sẽ là quá tốn kém để thực hiện nhiều kiểm tra dự phòng cho tính nguyên thủy cho mỗi thao tác, nhưng nó không phải là một loại thử nghiệm có thể được thực hiện tại thời điểm biên dịch. (Rất nhiều thao tác bạn muốn thực hiện trên các số nguyên tố, giả sử nhân, không tạo thành một bao đóng , tức là kết quả có thể không được đảm bảo là số nguyên tố (Đăng bài dưới dạng nhận xét vì tôi không biết tự lập trình chức năng.)