Tôi đang thực hiện một số thử nghiệm thuộc tính trong F # bằng FsCheck. Do đó, tôi muốn đảm bảo rằng các điều kiện nhất định luôn giữ, bất kể các đối số đầu vào.Phương pháp chung, ngắn gọn về kiểm tra đặc tính đối với các giá trị nan trong F # là gì?
Cân nhắc tôi xác định hàm nhận dạng tầm thường cho float
giá trị.
let floatId (x : float) = x
sau đó tôi định nghĩa một thử nghiệm của chức năng này mà tôi biết nên luôn luôn giữ:
let ``floatId returns input float`` x = floatId x = x
Đây là một thử nghiệm tầm thường, tôi chỉ kiểm tra mà gọi hàm sắc phao của tôi trả về giống như float đầu vào.
Tôi sau đó cắm chức năng này vào FsCheck:
Check.Quick ``floatId returns input float``
Thật không may, thử nghiệm bất động sản này không thành công!
Falsifiable, after 21 tests (0 shrinks) (StdGen (1872424299,296201373)): Original: nan
Tất nhiên, khi nhìn lại, đó là khá rõ ràng này sẽ xảy ra, chúng ta biết rằng nan <> nan
.
Do so sánh cấu trúc trong F #, điều này có thể gây ra các trường hợp thử nghiệm phức tạp hơn (hơi) phức tạp liên quan đến các bộ sưu tập.
Nếu tôi thiết kế một chức năng tương tự cho các danh sách float:
let listFloatId (lst : float list) = lst
let ``listFloatId returns input float list`` lst = listFloatId lst = lst
Falsifiable, after 6 tests (3 shrinks) (StdGen (1874889363,296201373)): Original: [nan; 2.0; 2.25; 4.940656458e-324] Shrunk: [nan]
Cùng một vấn đề một lần nữa!
Rõ ràng tôi có thể kỹ sư xung quanh vấn đề này bằng cách tạo ra các chức năng kiểm tra sự bình đẳng của riêng tôi, đó là tốt cho float
giá trị nhưng nó trở nên phức tạp hơn để mở rộng đến các bộ sưu tập như list
kể từ khi tôi phải bắt đầu sử dụng List.forall2
với chức năng bình đẳng tùy chỉnh của tôi và thường chuyên mã của tôi cho từng loại bộ sưu tập riêng lẻ.
Có cách nào giải quyết vấn đề chung trong F # không?
Tôi có thể giải quyết vấn đề này với một nhà điều hành mới đã thực hiện một sự bình đẳng có tính đến nan –
@JohnPalmer Tôi đang thực hiện điều này để đưa ra một giải pháp có thể không được biết rõ trên hồ sơ. Chắc chắn sẽ được quan tâm để nghe người khác. – TheInnerLight
Ah - không nhận ra bạn đã có câu trả lời cho điều này - có vẻ như chức năng đó về cơ bản là những gì bạn cần. –