二进制函数类型和包装类型

时间:2017-11-21 17:21:11

标签: haskell types wrapper typeclass

我有一个二进制函数,可以通过类(实际上是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
(...)

但也许有更好的东西?

0 个答案:

没有答案