haskell - 在 Haskell 中处理来自第三方库的数据类型的最佳实践?

标签 haskell types

我刚刚开始我的第一个真正的 Haskell 大小项目(一个网络应用程序),我开始遇到来自第 3 方库的类型在我的代码中泄漏的问题。这是一个简单的例子:

我的 Parser模块导入 Test.Parsec , 并导出一个返回 parseConfig 的函数 ( Either ParseError DbConfig ) , 其中ParseErrorParsec 中定义的数据类型库(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/

相关文章:

haskell - 使用 ghci 时如何重用 cabal 编译模块

parsing - 秒级调试

Scala:使用具体类型实现 Map

mysql - MySQL ALTER TABLE 会重新格式化字段数据吗?

c# - System.Byte[*] 是什么类型

vue.js - Vue中如何加载外部CSS

haskell - 是否可以使用迭代增量对键入的 Church 数字实现加法?

haskell - 这个hylo解决 "coin-change"问题的方案是怎么设计的呢?

haskell - 为什么 "let"语句会强制 "applicative do" block 需要 monad 约束?

java - ArrayList 的类型不兼容错误