您如何处理Haskell中的功能可见性和单元测试?

如果在模块中导出每个函数,以便单元测试可以访问它们,则可能会冒其他人调用不应在公共(public)API中使用的函数的风险。

我想到了使用{-# LANGUAGE CPP #-},然后用#ifdef围绕导出:

{-# LANGUAGE CPP #-}

module SomeModule
#ifndef TESTING
( export1
, export2
)
#endif
where

有没有更好的办法?

最佳答案

通常的惯例是将模块分为公共(public)部分和私有(private)部分,即

module SomeModule.Internal where

-- ... exports all private methods

然后是公共(public)API
module SomeModule where (export1, export2)

import SomeModule.Internal

然后,您可以在测试和其他对访问内部实现至关重要的地方导入SomeModule.Internal

这个想法是您的库的用户永远不会意外调用私有(private)API,但是如果知道自己在做什么(调试等),他们就可以使用它。与强制隐藏私有(private)API相比,这大大提高了库的可用性。

10-06 13:19