2015-09-03 20 views
3

我在为这个问题苦苦挣扎 - QuickCheck如何为所有类型生成值?也许它可以伪造它,只测试类型Arbitrary a => a使用QuickCheck生成存在类型?

我只是想知道一个人如何能做出任意的数据构造的实例与生存型:

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

是否有可能具有该类型的值?另外,这不是一个二级类型,而不是一个存在类型? –

+0

事实上,该类型的唯一值至少与'Foo a1(const undefined,const a2)一样坏' – dfeuer

回答

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?现在这是一个更高的订单。

我会推测,制作任意值涉及更高级别的类型并不是那种类型,因为它们倾向于以某种方式涉及函数,而且很难将任意函数限制为实际的函数想考虑。

相关问题