2015-04-08 17 views
9

Hãy xem xét các bài kiểm tra sau cho distributivity law between reverse and ++,Haskell QuickCheck tối thiểu quầy dụ

import Test.QuickCheck 

test :: [Int] -> [Int] -> Bool 
test xs ys = reverse (xs ++ ys) == reverse xs ++ reverse ys 

test2 :: (Eq a) => [a] -> [a] -> Bool 
test2 xs ys = reverse (xs ++ ys) == reverse xs ++ reverse ys 

Lưu ý cho các danh sách của Int rằng

*Main> quickCheck test 
*** Failed! Falsifiable (after 5 tests and 3 shrinks):  
[1] 
[0] 

Tuy nhiên, thử nghiệm cho danh sách các mục equatable,

*Main> quickCheck test2 
+++ OK, passed 100 tests. 

Điều gì làm cho lần kiểm tra thứ hai?

Cập nhật On biên soạn với main = quickCheck test2, lỗi tiếp theo vào loại biến mơ hồ gợi ý các vấn đề (như đã mô tả trong câu trả lời),

No instance for (Eq a0) arising from a use of `test2' 
The type variable `a0' is ambiguous 
Possible fix: add a type signature that fixes these type variable(s) 

Trả lời

14

Khi bạn thực sự đánh giá test2, GHCi phải chọn một loại a để sử dụng. Nếu không có thêm thông tin, các quy tắc mặc định mở rộng của GHCi làm cho nó mặc định là (), theo đó luật pháp là đúng.

13
> verboseCheck test2 

Passed: 
[] 
[] 
Passed: 
[] 
[] 
Passed: 
[(),()] 
[()] 
Passed: 
[(),(),()] 
[()] 
Passed: 
[()] 
[(),(),(),()] 
... 

Thông số đa hình mặc định là () và tất nhiên tất cả các giá trị này đều bằng nhau.

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