【问题标题】:Where do I define Arbitrary instances?我在哪里定义任意实例?
【发布时间】:2018-11-24 00:17:15
【问题描述】:

我不知道在哪里为我的数据类型定义 Arbitrary 实例。如果我将它in 放入包中,则包不必要地将QuickCheck 作为依赖项。如果我把它放在测试中,那么其他包就不能使用这个实例。如果我把它放在一个单独的 test-utils 包中,那么测试 also 必须放在一个单独的包中,所以它是一个孤儿实例,also stack test --coverage 不起作用.

还有哪些其他选择?

【问题讨论】:

    标签: haskell dependencies code-coverage haskell-stack quickcheck


    【解决方案1】:

    我通常会选择单独的包选项——但我不使用stack test --coverage。感谢您向我介绍它!

    (编辑:我可能会这样做,然后仅将测试标志选项用于运行stack test --coverage --flag thepackage:arbitrary,这样其他人就不必处理这些标志了。)

    stack 问题跟踪器上提出--coverage 问题可能也是值得的,因为在这种情况下,覆盖率检查工作会很好。

    您要求其他选项 - 最好的可能是测试标志。

    测试标志

    可以在您的 cabal 文件中定义一个标志(默认为 false),如果选择了该标志,它将仅使用您的 QuickCheck 依赖项构建模块。

    将所需的代码放在目录arbitrary 中(例如)。然后将以下等效内容添加到 package.yaml (1st sn-p) 或 the-library.cabal (2nd sn-p) 文件的相关部分:

    flags:
      arbitrary:
        description: Compile with arbitrary instances
        default: false
        manual: true
    
    library:
      ⁝
      when:
      - condition: flag(arbitrary)
        dependencies:
        - QuickCheck
        source-dirs:
        - arbitrary
    
    flag arbitrary
      description: Compile with arbitrary instances
      manual: True
      default: False
    
    library
      ⁝
      if flag(arbitrary)
        hs-source-dirs:
          arbitrary
        build-depends:
          QuickCheck
    

    然后,想要使用实例的包应在其stack.yaml (1st) 或 cabal.project (2nd) 文件中添加以下内容:

    flag:
      the-library:
        arbitrary: true
    
    constraints: the-library +arbitrary
    

    但是有一个小问题......目前该库无法仅在其测试套件中仅依赖+arbitrary 版本,除非它还定义了这样的标志。这可能是值得付出的代价。

    注意:我还没有测试下游包装。

    Ivan Milenovic's blog 作为初始资源很有用。

    DerivingVia/通用实例

    可能还有另一种可能性,现在 GHC 8.6 已经发布,DerivingViaBlöndal, Löh & Scott (2018) 中有一个针对 Arbitrary 实例的案例研究。

    您将创建新类型包装器,并为这些新类型实现 Arbitrary

    按原样,它并不能完全避免这个问题。但是您可以为这些新类型实现Generic,使使用generic-arbitrary 派生的实例与您想要的匹配。


    可能还有其他一些选择。特别是,QuickCheck 的依赖关系实际上并没有那么重。还有其他测试库。另外,请注意,已经讨论过将类似Arbitrary 的类型类分离到一个独立的库中。

    我也会建议内部库,但这不允许其他包使用您的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-02
      • 2011-06-12
      • 2018-12-05
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      相关资源
      最近更新 更多