.NET 的 "InternalsVisibleTo" 相当于 Haskell

.NET's "InternalsVisibleTo" equivalent in Haskell

在 .NET 中,我可以使用以下属性装饰我的程序集:

[<assembly: InternalsVisibleTo("MyProject.Test")>]

因此,所有标记为“内部”的模块都可以从“MyProject.Test”访问。我可以使用它,例如用于单元测试我不想在我的库中公开的功能。

我想知道 Haskell 的世界中是否有类似的东西。假设我有一个包含以下 .cabal 文件的库:

library
  exposed-modules:  MyLibrary.API
  other-modules:    MyLibrary.Utils
  -- ...

test-suite mylib-test
  -- ...
  build-depends:  base,
                  hspec,
                  my-library

有没有办法从 mylib-test 测试套件中引用“MyLibrary.Utils”?

您可以将其作为内部库的一部分,并依赖于 public 库和测试套件。包外将不可用。

library utils
    exposed-modules: MyLibrary.Utils

library
    exposed-modules: MyLibrary.API
    build-depends: utils

test-suite mylib-test
    build-depends: base, hspec, my-library, utils

或者,有一个强烈的惯例,无论如何都要公开模块,但在其名称中包含 Internal 并在文档中告诉人们您破坏了它是您购买的。