能否通过hlint强制要求Haskell记录字段使用严格模式?
如何用HLint强制Haskell记录字段添加严格标记
完全可以通过HLint的自定义规则实现这个需求。HLint支持用户编写自定义检查与修复逻辑,专门针对记录字段的严格性标记做强制约束。
实现步骤
1. 编写自定义HLint规则
HLint规则通过Haskell代码实现,核心是匹配未添加严格标记的记录字段,并生成对应的修复建议。以下是一个基础实现示例:
{-# LANGUAGE OverloadedStrings #-} module StrictRecordFields where import HLint (Rule(..), warn) import Language.Haskell.Exts rule :: Rule rule = Rule { ruleName = "Strict record fields" , ruleWhen = Always , ruleMatch = \case Decl (DataDecl _ _ _ _ (RecDecl _ _ fields) _) -> concatMap checkField fields _ -> [] , ruleFix = Just $ \case Decl (DataDecl sloc ctx name tyvars (RecDecl con conTy fields) derivs) -> let strictFields = map makeStrict fields in Just $ Decl (DataDecl sloc ctx name tyvars (RecDecl con conTy strictFields) derivs) _ -> Nothing } where checkField :: FieldDecl -> [(SrcSpan, String)] checkField (FieldDecl sloc _ ty) = case ty of -- 匹配没有严格标记的字段类型 TyCon{} -> [(srcSpanInfo sloc, "Record field must have a strict marker (!)")] _ -> [] makeStrict :: FieldDecl -> FieldDecl makeStrict (FieldDecl sloc names ty) = FieldDecl sloc names (BangType NoBang ty)
2. 配置HLint启用规则
在项目根目录的.hlint.yaml文件中,添加自定义规则的引用:
- modules: - StrictRecordFields - rules: - name: Strict record fields severity: error # 设为error可强制要求修正,warn则仅给出提醒
3. 运行检查与自动修复
- 执行
hlint src/可以扫描代码,输出所有未添加严格标记的记录字段。 - 执行
hlint --fix src/会自动将符合条件的字段类型前添加!标记,完成批量修复。
注意事项
- 上述规则为基础版本,可根据实际需求优化匹配逻辑,比如跳过已带有严格标记的字段、支持复杂类型(如带括号的类型、类型变量)等。
- 自定义HLint规则需要依赖
hlint库,可将其添加到项目的开发依赖中(如在cabal文件的build-depends或stack.yaml的extra-deps中声明)。
内容的提问来源于stack exchange,提问作者Michael Litchard
相关产品推荐
相关产品推荐

