Haskell如何重导出仅选择性导入部分标识符的模块?
结论
你给出的示例写法无法达到仅重导出选定导入标识符的预期效果:
- 该写法不属于Haskell 2010标准语法,依赖非官方GHC扩展,默认编译环境下会直接报错
- 就算手动开启对应扩展支持
import ... as 当前模块名的写法,后续新增其他被别名为当前模块名的导入时,很容易意外导出多余标识符,出现不可控的导出污染。
正确写法
不需要使用导入别名的特殊技巧,直接用Haskell标准原生的模块导出规则即可实现需求,逻辑非常清晰:
- 对需要部分重导出的模块,使用选择性导入,只引入你想要对外暴露的标识符
- 对需要全量重导出的模块,正常全量导入即可
- 在模块头部的导出列表中:
- 列出本模块自定义的需要对外暴露的标识符
- 对所有需要重导出内容的模块,统一写
module 模块名,编译器会自动把你从该模块导入的所有标识符重导出,不会包含你没导入的内容
参考实现代码:
module Test ( -- 导出本模块自定义的f f -- 重导出从Prelude选定导入的内容 , module Prelude -- 重导出从A全量导入的内容 , module A ) where -- 只导入Prelude的map、filter,最终也只会重导出这两个标识符 import Prelude (map, filter) -- 全量导入A的所有导出内容,这些内容会被全部重导出 import A f x = x
这个写法完全兼容Haskell标准,不需要开启任何编译扩展,导出范围完全可控。后续如果需要调整某个模块重导出的标识符范围,只需要修改对应模块的import导入列表即可,不需要改动导出列表的其他结构。
内容的提问来源于stack exchange,提问作者luochen1990
相关产品推荐
相关产品推荐

