问题标签 [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.
haskell - 使用 Hedgehog(或任何其他基于属性的测试框架)生成随机 GADT 的最安全方法
我有这样的 GADT:
我想要一个这样的功能:
可以生成随机TType
类型的构造函数。我可以简单地通过创建存在限定的数据类型来做到这一点
0
然后生成从到1
(包括)的随机数并AnyType
根据整数值创建。像这样:
但是这种方法对我有几个缺点:
- 没有外部类型安全。如果我向数据类型添加另一个构造函数,
TType
我可能会忘记修复测试,编译器不会对此发出警告。 - 编译器不能阻止我写作
intToAnyType 1 = MkAnyType TInt
。 - 我不喜欢这个
error
。Int
类型对我来说太宽泛了。让这种模式匹配详尽无遗会很好。
我可以在 Haskell 中做些什么来尽可能地消除这里的缺点?最好使用此模块中的生成器:
haskell - 刺猬不尊重 withTest
我正在使用带有美味发现的 Hedgehog,并编写了一个实现 Square 2D 坐标/向量的简单类。然后我编写了以下测试。唯一的问题是,它似乎只运行一个测试,运行速度非常快,让我相信这里有问题。
如何让它运行测试 10000 次?
haskell - 显示集成收缩限制的示例
我刚刚观看了一个视频,该视频介绍了基于属性的测试的集成收缩概念。该方法似乎比类型定向收缩具有一些优势,但是在此 reddit 线程中指出,集成收缩方法不适用于单子生成器:
以您的方式进行收缩并不适合生成器的一元样式。这是一个示例,考虑生成一个任意列表(暂时忽略终止):
现在,收缩的默认行为将首先收缩 x(保持 xs 不变),然后收缩 xs(保持 x 不变),这严重限制了收缩(局部最小值的概念现在不那么强大了)。
我将上述评论读为“集成收缩可能无法提供全局最小反例”。但是,由于hedgehog
似乎能够为列表上的失败属性找到最少的反例,我想知道是否有一个示例可以显示上面引用中指出的缺点。
haskell - 为什么这个收缩树看起来像使用过滤器时的样子
我试图了解 filter 在使用hedgehog
集成收缩时对生成器的收缩树有什么影响。
考虑以下函数:
打印收缩树时:
我会得到如下所示的收缩树:
这是一棵非常深的树,只包含x
's,discard
最后是 a。
为什么收缩函数不断返回x
's 而不是一个空列表,这表明没有进一步的收缩可能?
haskell - Hedgehog.Gen.list的定义中freeze有什么作用
Hedgehog.Gen.list
定义如下:
我原以为 usingShrink.list
足以产生列表的所有缩小。但是它会调用freeze
:
从函数的评论中,我理解了为什么使用它,但我对如何实现这个目标以及将其排除在外会产生什么效果感到困惑。
haskell - 如何将 MonadUnliftIO 或 MonadBaseControl 与 Hedgehog 一起使用?
我有一个“测试包装器”,它为每个测试创建一个带有随机名称的数据库表(这样它们就不会相互干扰),并确保在测试结束时删除该表:
根据我在以下链接上阅读的内容...
- https://github.com/hedgehogqa/haskell-hedgehog/issues/284
- https://github.com/hedgehogqa/haskell-hedgehog/issues/248
- https://www.stackage.org/haddock/lts-12.1/hedgehog-0.6/Hedgehog.html#v:test
...我尝试了以下变体,但失败了:
现在,我只是在尝试随机变化,希望能找到任何解决这个类型级拼图游戏的方法!帮助将不胜感激。
编辑
这是我第一次尝试的完整片段,我正在使用UnliftIO
,但它不起作用,因为TestT m
没有MonadUnliftIO (TestT IO)
实例。
接下来,如果我使用(lifted-base
我不知道为什么要摆弄. 鉴于有一个实例,是否可以安全地定义一个实例?ResourceT
MonadUnliftIO
TestT m
MonadBaseControl
UnliftIO