2016-09-06 20 views
5

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?

+1

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 –

+0

@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

+0

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. –

Trả lời

5

Bạn có thể giải quyết vấn đề này bằng cách sử dụng chức năng LanguagePrimitives.GenericEqualityER. Điều này kiểm tra sự bình đẳng bằng cách sử dụng các khái niệm tương đương Equivalance Relation. Chức năng này thực sự là trang web ví dụ cụ thể khi so sánh các danh sách [nan].

trường hợp kiểm tra có thể được định nghĩa như thế này:

let ``ER : floatId returns input float`` x = LanguagePrimitives.GenericEqualityER (floatId x) x 

let ``ER : listFloatId returns input float list`` lst = LanguagePrimitives.GenericEqualityER (listFloatId lst) lst 

thời gian này:

Ok, passed 100 tests. 
Ok, passed 100 tests. 

(Tôi yêu cầu, và trả lời, câu hỏi này bởi vì tài sản trên được nêu ra trong kênh Slack của Quỹ Phần mềm FSharp và tôi nghĩ sẽ hữu ích khi có giải pháp này trong hồ sơ.Tôi có thể tìm thấy hầu như không đề cập đến chức năng này trực tuyến ngoài tài liệu trên mô-đun LanguagePrimitives).

Các vấn đề liên quan