如何在GHC的-Wmissing-import-lists中排除记录字段通配符导入?
问题解答
1. 让-Wmissing-import-lists排除记录字段通配符导入
GHC的-Wmissing-import-lists警告默认会覆盖所有未指定显式导入列表的导入语句,包括记录类型的(..)通配符导入(比如import MyModule (MyRec(..)))。要实现你需要的行为——仅对普通无导入列表的导入触发警告,忽略记录字段的通配符导入——可以组合使用两个警告选项:
- 启用主警告:
-Wmissing-import-lists - 禁用针对记录通配符的子警告:
-Wno-missing-import-lists-for-record-wildcards
你的示例命令可以修改为:
$ ghc -XNoImplicitPrelude -Wmissing-import-lists -Wno-missing-import-lists-for-record-wildcards {a,b,c}.hs
场景匹配说明
- a.hs/b.hs:如果使用的是记录字段通配符导入(如
import Data.Types (User(..))),不会触发警告; - c.hs:如果使用的是无显式导入列表的普通导入(如
import Data.Utils),会触发-Wmissing-import-lists警告。
2. 启用NoFieldSelectors后,仅导入记录类型即可用OverloadedRecordDot访问字段
完全可以。NoFieldSelectors的作用是阻止GHC为记录字段生成全局顶级选择器函数,而OverloadedRecordDot是通过类型推导来解析字段访问,不依赖这些顶级选择器。只要你导入了记录类型(无需显式导入字段),就能通过.语法访问其字段。
示例代码
模块A(定义记录)
{-# LANGUAGE NoFieldSelectors #-} module Person where data User = User { username :: String , email :: String } deriving Show
模块B(使用记录)
{-# LANGUAGE OverloadedRecordDot #-} import Person (User) -- 仅导入记录类型,不导入字段 main :: IO () main = do let user = User "jane_doe" "jane@example.com" print user.username -- 正常访问字段 print user.email -- 正常访问字段
这段代码可以正常编译运行,因为OverloadedRecordDot会通过User类型的信息找到对应的字段,不需要导入字段名或依赖顶级选择器。
内容的提问来源于stack exchange,提问作者Jan Matejka
相关产品推荐
相关产品推荐

