使用QuickCheck生成存在类型?

时间:2015-09-03 22:42:43

标签: haskell quickcheck existential-type

我正在努力解决这个问题 - QuickCheck如何为所有类型生成值?也许它可以伪造它,并且只测试具有上下文Arbitrary a => a的类型?

我只是想知道某人如何为具有存在类型的数据构造函数创建任意实例:

data Foo a = Foo a (forall b. (a -> b, b -> a))

1 个答案:

答案 0 :(得分:5)

要说出你真正想做的事情有点难,特别是因为你的示例类型并没有多大意义。考虑别的事情:

newtype WrappedLens s t a b = WrappedLens (forall f . Functor f => (a -> f b) -> s -> f t)

newtype WL = WL (WrappedLens (Int, Int) (Int, Int) Int Int)

是否可以制作任意WL?当然!只需显式传递fmap并使用任意函数实例。有可能让任意WL成为一个守法的镜头吗?现在这是一个更高的订单。

我推测,制作涉及更高等级类型的任意值的难点不是类型,而是因为它们倾向于以某种方式涉及函数,并且很难将任意函数约束到你真正想要考虑的那些。