Tôi muốn thực hiện một số thử nghiệm tương tự về các loại khác nhau trong thư viện của mình.HTF không kiểm tra các đạo cụ được tạo bởi TH
Để đơn giản hóa mọi thứ, giả sử tôi có một số loại véc tơ đang triển khai lớp Num
và tôi muốn tạo cùng một thuộc tính QuickCheck kiểm tra prop_absNorm x y = abs x + abs y >= abs (x+y)
sẽ hoạt động trên tất cả các loại trong thư viện.
tôi tạo ra tài sản đó sử dụng TH:
$(writeTests
(\t ->
[d| prop_absNorm :: $(t) -> $(t) -> Bool
prop_absNorm x y = abs x + abs y >= abs (x+y)
|])
)
chức năng của tôi để tạo ra các bài kiểm tra có chữ ký sau đây:
writeTests :: (TypeQ -> Q [Dec]) -> Q [Dec]
Chức năng này sẽ tìm kiếm tất cả các trường của lớp vector của tôi VectorMath (n::Nat) t
(và, tại đồng thời, các trường hợp của Num
) thông qua reify ''VectorMath
và tạo tất cả các chức năng chống sao cho phù hợp. -ddump-splices
cho thấy một cái gì đó như thế này:
prop_absNormIntX4 :: Vector 4 Int -> Vector 4 Int -> Bool
prop_absNormIntX4 x y = abs x + abs y >= abs (x+y)
prop_absNormCIntX4 :: Vector 4 CInt -> Vector 4 CInt -> Bool
prop_absNormCIntX4 x y = abs x + abs y >= abs (x+y)
...
prop_absNormFloatX4 :: Vector 4 Float -> Vector 4 Float -> Bool
prop_absNormFloatX4 x y = abs x + abs y >= abs (x+y)
prop_absNormFloatX3 :: Vector 3 Float -> Vector 3 Float -> Bool
prop_absNormFloatX3 x y = abs x + abs y >= abs (x+y)
Vấn đề là tất cả các thuộc tính bằng tay bằng văn bản được kiểm tra, nhưng những người tạo ra thì không.
Lưu ý 1: Tôi đã tạo và không tạo thuộc tính trong cùng một tệp (tức là biểu thức TH $(..)
có cùng tệp với các đạo cụ khác).
Lưu ý 2: danh sách các loại để tạo chức năng prop thay đổi - Tôi muốn thêm các phiên bản khác của VectorMath
sau đó, vì vậy chúng sẽ tự động được thêm vào danh sách kiểm tra.
Tôi tin rằng vấn đề là HTF (có lẽ sử dụng TH quá) phân tích cú pháp tệp gốc, không phải tệp có mã được tạo - nhưng tôi không thể hiểu tại sao điều này xảy ra.
Vì vậy, câu hỏi của tôi là: cách giải quyết vấn đề này? Nếu không thể sử dụng đạo cụ tạo ra TH, thì có thể thực hiện các kiểm tra QuickCheck trên các loại khác nhau (tức là nó thay thế chúng thành prop_absNorm :: Vector 4 a -> Vector 4 a -> Bool
) không?
Một giải pháp thay thế khác có thể là sử dụng TH để thêm các mục kiểm tra theo cách thủ công vào htf_Main, nhưng tôi chưa tìm ra cách thực hiện điều này; và nó không giống như một giải pháp sạch đẹp.
Đây là giải pháp đầy đủ, nếu ai đó quan tâm https://github.com/achirkin/fastvec/tree/master/test/VectorTests – artem