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