Tôi có một loại lớp Atomic
, xác định các hàm để chuyển đổi một số loại nhất định thành/từ giá trị trình bao bọc (Atom
). Tôi muốn xác định thuộc tính QuickCheck nói rằng: "cho tất cả các phiên bản Atomic
, mọi giá trị có thể được lưu trữ và truy xuất một cách an toàn". Khu nghỉ dưỡng trông như thế này:Kiểm tra thuộc tính QuickCheck đối với nhiều loại?
class Atomic a where
toAtom :: a -> Atom
fromAtom :: Atom -> Maybe a
prop_AtomIdentity x = fromAtom (toAtom x) == Just x
Tuy nhiên, nếu tôi chỉ cố gắng chạy mà tài sản thông qua QuickCheck, nó chỉ chọn một ví dụ (Bool
) và kiểm tra nó. Tôi hiện đang làm việc xung quanh rằng bằng cách định nghĩa chữ ký kiểu cho từng loại nguyên tử được hỗ trợ trong danh sách kiểm tra, nhưng đây là tiết và dễ bị lỗi:
containerTests =
[ run (prop_AtomIdentity :: Bool -> Bool)
, run (prop_AtomIdentity :: Word8 -> Bool)
, run (prop_AtomIdentity :: String -> Bool)
{- etc -} ]
Tôi đang cố gắng để xác định một chức năng mà sẽ làm việc này tự động :
forallAtoms :: (Atomic a, Show a) => (a -> Bool) -> [TestOptions -> IO TestResult]
forallAtoms x =
[ run (x :: Bool -> Bool)
, run (x :: Word8 -> Bool)
, run (x :: String -> Bool)
{- etc -} ]
containerTests = forallAtoms prop_AtomIdentity
Nhưng nó không thành công với một lỗi typecheck:
Tests/Containers.hs:33:0:
Couldn't match expected type `Word8' against inferred type `String'
In the first argument of `run', namely `(x :: Word8 -> Bool)'
In the expression: run (x :: Word8 -> Bool)
In the expression:
[run (x :: Bool -> Bool), run (x :: Word8 -> Bool),
run (x :: String -> Bool)]
có cách nào tốt hơn để kiểm tra một tài sản chống lại nhiều loại QC? Nếu không, forallA có thể được thực hiện để làm việc hoặc không được hỗ trợ bởi hệ thống kiểu?
Không thể tin rằng nó quá đơn giản. Cảm ơn! –