我有一个二进制函数,可以通过类(实际上是a
)处理类型W a
和相同Num
的包装版本。我想检查它在两者上的工作方式是否相同,并尝试编写以下测试:
prop_binary :: (a -> a -> a) -> W a -> W a -> Bool
prop_binary op wrappedm@(W m) wrappedn@(W n) =
m `op` n == result
where (W result) = wrappedm `op` wrappedn
但是这不能编译。我尝试了一些不同的东西,包括添加Num
约束,但我无法理解。
{-# LANGUAGE AllowAmbiguousTypes, FlexibleContexts, Rank2Types - #}
prop_binary :: (Eq b, Num b, Num (W b)) => (forall a. (Num a) => a -> a -> a) -> W b -> W b -> Bool
(...)
但也许有更好的东西?