我刚刚开始我的第一个真正的 Haskell 大小项目(一个网络应用程序),我开始遇到来自第 3 方库的类型在我的代码中泄漏的问题。这是一个简单的例子:
我的 Parser
模块导入 Test.Parsec
, 并导出一个返回 parseConfig
的函数 ( Either ParseError DbConfig
) , 其中ParseError
是 Parsec
中定义的数据类型库(DbConfig
是我的应用程序的自定义数据类型,为简洁起见未显示)。
-- Parser.hs
module Parser where
import Text.Parsec
parseConfig :: String -> Either ParseError DbConfig
parseConfig = parse ...
稍后,我想用我的 parseConfig
功能,但为了使用它,我必须导入 Text.Parsec
再次这样我就可以访问 ParseError
类型。
-- Api.hs
module Api where
import Parser
import Text.Parsec
getConfigFromBody :: Object -> Either ParseError DbConfig
getConfigFromBody = parseConfig . (...)
就管理导入而言,这不仅很麻烦,而且关注点分离也很差,所以我知道这不是最好的方法。我的问题是,管理此问题的最佳做法是什么?创建类型同义词是否理想?
type ConfigParseError = ParseError
parseConfig :: String -> Either ConfigParseError DbConfig
parseConfig = parse ...
就保留 Parsec
而言,这似乎是合理的我的内部依赖 Parser
模块,但别名库类型似乎是默认使用的奇怪模式。
所以我的问题是,大型 Haskell 应用程序或库如何处理这个问题?是否有管理来自第 3 方库的数据类型的通用技术?
最佳答案
我还没有准备好给出一个很好的最佳实践列表,但是对于初学者来说,如果你想让东西井井有条,使用显式导出而不是仅仅导出所有内容,例如:
module Parser
( parseConfig
) where
...
显式导出还允许您重新导出您的导入,例如
module Parser
( parseConfig
, ParseError(..)
) where
...
之后,您只需导入解析器
,就可以使用ParseError
,就好像它是在Parser
中定义的一样。
我认为这应该可以解决您眼前的问题。
关于haskell - 在 Haskell 中处理来自第三方库的数据类型的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30854359/