使用 QuickCheck 生成存在类型?

Generating an Existential type with QuickCheck?

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

的类型

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

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

很难说出您真正想做什么,尤其是因为您的示例类型没有多大意义。考虑其他事情:

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这样的中规中矩的镜头?现在这是一个更高的要求。

我推测,使任意值涉及更高等级类型的难点不在于类型,而在于它们倾向于以某种方式涉及函数这一事实,而且很难将任意函数限制为您其实要考虑