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

能否通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:25:09