问题标签 [haskell-hedgehog]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
117 浏览

haskell - 高阶可遍历函子是否有相应的光学元件?

Hedgehog有一个HTraversable这样定义的类:

它与它们的Var类型一起用于参数化类型的值是具体的还是抽象的。t有 kind(* -> *) -> *并且是一个高阶函子,尽管他们实际上没有那个类f,g并且h有 kind * -> *。我已经看到在几个不同的库中定义了相同的东西。

有没有办法摆脱这种情况?我承认我什至不知道那会做什么,而且我对镜片或普通镜片也不是很舒服Traversable

0 投票
1 回答
326 浏览

haskell - 使用 Hedgehog(或任何其他基于属性的测试框架)生成随机 GADT 的最安全方法

我有这样的 GADT:

我想要一个这样的功能:

可以生成随机TType类型的构造函数。我可以简单地通过创建存在限定的数据类型来做到这一点

0然后生成从到1(包括)的随机数并AnyType根据整数值创建。像这样:

但是这种方法对我有几个缺点:

  1. 没有外部类型安全。如果我向数据类型添加另一个构造函数,TType我可能会忘记修复测试,编译器不会对此发出警告。
  2. 编译器不能阻止我写作intToAnyType 1 = MkAnyType TInt
  3. 我不喜欢这个errorInt类型对我来说太宽泛了。让这种模式匹配详尽无遗会很好。

我可以在 Haskell 中做些什么来尽可能地消除这里的缺点?最好使用此模块中的生成器:

0 投票
1 回答
210 浏览

haskell - 在 Hedgehog 中通过“Gen”或通过“forAll”生成随机输入的区别

假设,我想在 Haskell中的刺猬Sum库的帮助下测试以下关联属性:

我实际上有两种生成随机输入的方法。

1. 全部生成Gen(使用GenApplicative 和 Monad 实例)

2.生成下的每个字段forAll

我想知道,两种方法有什么区别?它是否会以某种方式影响性能、并行化或随机性?

0 投票
0 回答
113 浏览

haskell - 刺猬不尊重 withTest

我正在使用带有美味发现的 Hedgehog,并编写了一个实现 Square 2D 坐标/向量的简单类。然后我编写了以下测试。唯一的问题是,它似乎只运行一个测试,运行速度非常快,让我相信这里有问题。

如何让它运行测试 10000 次?

0 投票
0 回答
111 浏览

haskell - 如何在`hedgehog`中使用`GenT`

hedgehog图书馆里,有一个GenT单子变压器。但是该forAll函数采用Gen类型。

有一个forAllT功能,但它在一个Internal模块中。

因此,如果我想使用具有特定 monad 的生成器 monad 变压器(例如State),那么使用这种 monad 的方法是GenT什么?

0 投票
2 回答
123 浏览

haskell - 显示集成收缩限制的示例

我刚刚观看了一个视频,该视频介绍了基于属性的测试的集成收缩概念。该方法似乎比类型定向收缩具有一些优势,但是在此 reddit 线程中指出,集成收缩方法不适用于单子生成器:

以您的方式进行收缩并不适合生成器的一元样式。这是一个示例,考虑生成一个任意列表(暂时忽略终止):

现在,收缩的默认行为将首先收缩 x(保持 xs 不变),然后收缩 xs(保持 x 不变),这严重限制了收缩(局部最小值的概念现在不那么强大了)。

我将上述评论读为“集成收缩可能无法提供全局最小反例”。但是,由于hedgehog似乎能够为列表上的失败属性找到最少的反例,我想知道是否有一个示例可以显示上面引用中指出的缺点。

0 投票
2 回答
130 浏览

haskell - 为什么这个收缩树看起来像使用过滤器时的样子

我试图了解 filter 在使用hedgehog 集成收缩时对生成器的收缩树有什么影响。

考虑以下函数:

打印收缩树时:

我会得到如下所示的收缩树:

这是一棵非常深的树,只包含x's,discard最后是 a。

为什么收缩函数不断返回x's 而不是一个空列表,这表明没有进一步的收缩可能?

0 投票
0 回答
55 浏览

haskell - Hedgehog.Gen.list的定义中freeze有什么作用

Hedgehog.Gen.list定义如下:

我原以为 usingShrink.list足以产生列表的所有缩小。但是它会调用freeze

从函数的评论中,我理解了为什么使用它,但我对如何实现这个目标以及将其排除在外会产生什么效果感到困惑。

0 投票
1 回答
127 浏览

haskell - Haskell,定义类型多态的函数的特化

刺猬中使用状态机时,我必须定义一个更新模型状态的函数。它的类型应该是forall v. Ord1 v => state v -> input v -> Var output v -> state v(参见Update构造函数Callback)。

现在,我想访问output,但我发现的唯一功能是concrete,但它指定v了我的更新功能。

如何定义满足类型的更新函数,Update同时仍然让我得到输出(大概是通过使用concrete)?

0 投票
1 回答
150 浏览

haskell - 如何将 MonadUnliftIO 或 MonadBaseControl 与 Hedgehog 一起使用?

我有一个“测试包装器”,它为每个测试创建一个带有随机名称的数据库表(这样它们就不会相互干扰),并确保在测试结束时删除该表:

根据我在以下链接上阅读的内容...

...我尝试了以下变体,但失败了:

现在,我只是在尝试随机变化,希望能找到任何解决这个类型级拼图游戏的方法!帮助将不胜感激。

编辑

这是我第一次尝试的完整片段,我正在使用UnliftIO,但它不起作用,因为TestT m没有MonadUnliftIO (TestT IO)实例。

接下来,如果我使用(lifted-base我不知道为什么摆弄. 鉴于有一个实例,是否可以安全地定义一个实例?ResourceTMonadUnliftIOTestT mMonadBaseControlUnliftIO