You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell如何重导出仅选择性导入部分标识符的模块?

结论

你给出的示例写法无法达到仅重导出选定导入标识符的预期效果:

  • 该写法不属于Haskell 2010标准语法,依赖非官方GHC扩展,默认编译环境下会直接报错
  • 就算手动开启对应扩展支持import ... as 当前模块名的写法,后续新增其他被别名为当前模块名的导入时,很容易意外导出多余标识符,出现不可控的导出污染。
正确写法

不需要使用导入别名的特殊技巧,直接用Haskell标准原生的模块导出规则即可实现需求,逻辑非常清晰:

  1. 对需要部分重导出的模块,使用选择性导入,只引入你想要对外暴露的标识符
  2. 对需要全量重导出的模块,正常全量导入即可
  3. 在模块头部的导出列表中:
  • 列出本模块自定义的需要对外暴露的标识符
  • 对所有需要重导出内容的模块,统一写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:45:52