2012-09-17 12 views
7

Tôi đã một chức năng, rev, trả về một số giá trị cho một loại đó là trong ba typeclasses:Làm thế nào để sử dụng từ bổ nghĩa với QuickCheck (Positive trong trường hợp của tôi)

rev :: (Integral a, Show a, Read a) => a -> a 
rev = read . reverse . show 

Tôi muốn thử nghiệm một số tài sản về nó với quickcheck. Mặc dù, tôi không quan tâm đến việc thử nghiệm các giá trị âm của các loại tích phân vì tôi đang sử dụng Integer do thiếu loại Natural trong thư viện cơ sở. Vì vậy, tôi nghĩ, hãy đối lập với giá trị được tạo khi giá trị được tạo là số âm và tôi sẽ ổn:

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id n | n >= 0 = (rev.rev) n == n 
      | otherwise = let n' = -n in (rev.rev) n' == n' 

(thuộc tính được kiểm tra không quan trọng ở đây - cụ thể là nó không giữ cho các giá trị rất cơ bản và tôi biết điều đó, nó không phải là chủ đề của câu hỏi này)

Sau đó, tôi chạy vào trình sửa đổi Positive và nghĩ rằng mặc dù thử nghiệm của tôi hiện đang hoạt động, sẽ tốt hơn khi thực hiện nó trong một đẹp hơn. Vì vậy, tôi đã thử:

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id n = (rev.rev) n == n 

Tôi phải thừa nhận rằng tôi đã rất ngạc nhiên khi được biên soạn. Nhưng sau đó một lỗi popped khi chạy thử nghiệm:

*** Failed! Exception: 'Prelude.read: no parse' (after 1 test): 
Positive {getPositive = 1} 

Vì vậy, tôi nghĩ, "MMK, phải khai báo Positive điều này một thể hiện của Read". Vì vậy, tôi đã làm điều đó, nhưng trường hợp đã được tuyên bố trong thư viện quickCheck có vẻ như bởi vì ghci hét lên với tôi.

Và tại thời điểm này tôi bị mất, vì tôi không tìm thấy tài liệu hay (nếu có).

Bất kỳ con trỏ nào giúp tôi hiểu các công cụ sửa đổi và những điều tốt đẹp khác trong thư viện kiểm tra nhanh sẽ được đánh giá cao.

+5

Không phân tích cú pháp vì 'rev (Positive {getPositive = 1})' là 'read"} 1 = evitisoPteg {evitisoP "'. –

Trả lời

17

Cách phổ biến của việc sử dụng các công cụ sửa đổi này là đối sánh mẫu trên chúng, ví dụ:

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id (Positive n) = (rev.rev) n == n 

Bằng cách này, n sẽ có loại cơ bản.

+0

blah thậm chí không nghĩ rằng để thử điều đó. Tôi ngớ ngẩn quá. Cảm ơn :) – m09