HLint一次对每个模块进行隔离操作,因此HLint不知道类型或范围内的名称。 这个决定是经过深思熟虑的,允许HLint并行化并在可能不进行类型检查的代码上增量使用。 如果正确解析代码需要固定性 可以提供 . 以下人员的在场 序列 可能会导致一些提示(即eta-reduction)改变程序的语义。 一些转换后的程序可能需要 附加类型签名 尤其是当转换触发单态限制或涉及rank-2类型时。 在极少数情况下,可能有 无处可写 所需的类型签名。 有时,HLint会以某种方式更改代码,导致值默认为不同类型,这可能会改变行为。 HLint假定单个表达式中的重复相同表达式用于同一类型。 这个 可重新绑定语法 扩展可能导致HLint建议不正确的更改。 HLint可以使用C预处理器标志的知识进行配置,但一次只能看到一组有条件的代码。 HLint打开了许多语言扩展,因此它可以解析更多的文档,有时会破坏其他合法的语法-例如。 {-#内联foo#-} 不适用于 魔法哈希 , foo$bar(美元) 意思不同于 TemplateHaskell公司 。可以使用禁用这些扩展 -XNoMagicHash 或 -XNoTemplateHaskell公司 等。 HLint不运行任何自定义预处理器,例如。 降价上网 或 记录-输出-预处理器 ,因此使用它们的代码通常无法解析。 一些提示,比如 使用常量 ,不适用于未吊装(即未照明和未装箱)类型。 一些语言扩展,如 严格 可能会导致某些提示(例如eta减少)不正确。
$ hlint darcs-2.1.2
darcs-2.1.2\src\CommandLine.lhs:94:1:警告:使用concatMap
找到:
concat$map转义C
也许:
concatMap转义C
darcs-2.1.2\src\CommandLine.lhs:103:1:建议:使用较少的括号
找到:
ftable++(映射(\(c,x)->(到上c,urlEncode x))ftable)
也许:
ftable++映射(\(c,x)->(toUpper c,urlEncode x))ftable
darcs-2.1.2\src\darcs\Patch\Test.lhs:306:1:警告:使用更有效的单数变体
找到:
mapM(delete_line(fn2fp f)line)旧
也许:
mapM_(delete_line(fn2fp f)line)旧
…更多提示。。。
最初,运行 hlint公司-- 报告 生成 报告.html 包含HLint发现的所有问题的列表。 纠正那些你认为值得纠正的错误,并不断重复。 一旦你高兴了,就跑 hlint公司-- 默认值>.hlint.yaml ,它将生成一个设置文件,忽略当前未完成的所有提示。 随着时间的推移,您可能希望编辑列表。 对于较大的项目,添加 自定义提示或规则 .
卷曲-sSL https://raw.github.com/ndmitchell/hlint/master/misc/run.sh | sh-s .
很多编辑器都有HLint插件(相当多的编辑器有多个HLint插件)。 HLint是多个Haskell IDE的一部分, haskell语言服务器 , ghc-mod公司 和 Intero公司 . HLint源插件 使HLint可以作为GHC插件使用。 夹板 是另一个源插件,如果您使用的是最新的GHC版本,则不需要重新分析GHC源。 代码气候 是一个用于分析的CI,它集成了HLint。 危险 可用于使用HLint建议自动评论pull请求。 重新设计样式 包含HLint Restyler以自动运行 hlint—重构 在GitHub拉请求中更改的文件上。 hlint试验 帮助您使用HLint编写一个小型测试运行程序。 智者 使用内联提示自动向存储库中打开的拉请求提交评论。 圆形CI 有一个插件可以更轻松地运行HLint。 haskell/动作 有 hlint设置 和 hlin运行 GitHub的操作。 haskell-作用/hlint-scan 是使用HLint的GitHub操作 代码扫描 .
(需要'hs-lint) (化解my-haskell-mode-hook() (local-set-key“\C-cl”'hs-lint) (添加hook“haskell-mode-hook”my-haskell-mode-hok)
HLint将只检查 #如果 ,基于定义的宏。 任何缺失 #包括 文件将在控制台上生成警告,但报告中没有信息。
增加懒惰 -例如 foldl(&&)为True 建议 和 包括此注释。 新代码将适用于无限列表,而旧代码则不适用。 增加懒惰通常是一个好主意。 减少懒惰 -例如 (fst a,snd a) 建议 一 包括此注释。 在求值时,如果a是错误,则新代码将引发错误,而旧代码将生成包含两个错误值的对。 只有少量的提示可以减少懒惰,任何依赖于原始代码懒惰的人都会被建议添加注释。 删除错误 -例如 文件夹1(&&) 建议 和 包括纸币 删除[]上的错误 。新代码将生成 真的 而旧代码将引发错误。 除非您依赖空列表抛出的异常,否则此提示是安全的,如果您确实依赖该异常,建议您添加注释。
错误 -默认情况下,仅用于分析错误。 警告 -例如 concat(映射f x) 建议 concatMap f x 作为“警告”严重性提示。 从样式的角度来看,应该始终替换 凹面(concat) 和 地图 具有 凹面贴图 . 建议 -例如 x!! 0 建议 头部x 作为“建议”严重性提示。 通常情况下 头 是表示列表的第一个元素的一种更简单的方法,尤其是在您归纳处理列表时。 然而,在表达式中 f(x!!4)(x ,将中间参数替换为 头 这使得遵循这种模式变得更加困难,这可能是一个坏主意。 建议提示通常是值得的,但不应盲目应用。
{git-diff--diff-filter=d--仅名称 $( git合并基HEAD原点/主 ) -- " ***.hs(小时) " && git ls-files-o--不包括标准-- " ***.hs(小时) " ; } | xargs hlint公司
{git-diff--diff-filter=d--仅名称 $( git合并基HEAD原点/主 ) -- " ***.hs(小时) " && git ls-files-o--不包括标准-- " ***.hs(小时) " ; } | xargs-I文件hlint文件--refract--重构选项= " --inplace—步骤 "
未来 ,建议切换 返回 对于 纯净的 . 额外的 ,它建议替换引入对 额外的 图书馆 . 使用透镜 ,它建议替换引入对 透镜 图书馆 . use-th-引号 ,建议使用 [|x|] 如果可能的话。 概括 建议使用更通用的方法,例如。 功能性维修计划 而不是 地图 . 广义一致性 ,这建议使用更通用的方法,但仅当它们更短时,例如。 也许是真的 成为 全部的 . 美元 这表明 b$c美元 替换为 答:。 b美元c . 教学 它鼓励一种简单的初学者友好的风格,学习相关的功能。
- 组 : {name:未来,已启用:true}
foo xs格式 = 凹面(concat) ( 地图 操作xs)
HLint旨在改进代码,并教会作者更好的风格。 单独进行修改有助于此过程。 有时这些步骤相当复杂,通过自动组合这些步骤,用户可能会感到困惑。 有时HLint会出错。 如果递归地应用建议,则会出现一个错误。 有些人只利用了其中的一些建议。 在上面的示例中,使用concatMap是一个好主意,但有时eta缩减不是。通过分别建议它们,人们可以进行选择。 有时转换后的表达式会很大,进一步的提示将应用于结果的某个小部分,这看起来很混乱。 考虑 f$(a b) 。有两个有效提示,要么删除$,要么删除括号,但只能应用一个。
批注产生的不明确类型变量“t0”
防止求解约束“(Data.Data.Data t0)”。
{-# 人工神经网络 someFunc(“HLint:ignore使用fmap”::String)#-}
hlint--默认值>.hlint.yaml
向所有运行添加命令行参数,例如。 --颜色 或 -XNoMagicHash . 忽略某些提示,可能在某些模块/函数中。 限制GHC标志/扩展/功能的使用,例如禁止 箭头 和 非安全性能IO . 添加其他特定于项目的提示。
# 代码当前触发的警告 - 忽视 : {name:“冗余$”} # 20个提示 - 忽视 : {name:“未使用的语言杂注”} # 29个提示
./backend/tests/api-tests/src/Main.hs:116:51:警告:冗余== 找到: regIsEnabled rr==真 也许: regIsEnabled rr(注册已启用rr)
{-#ANN模块“HLint:ignore”#-} 或 {-#HLINT忽略#-} 或 {-HLINT忽略-} -忽略此模块中的所有提示(使用 模块 字面意思,不是模块的名称)。 {-#ANN模块“HLint:ignore Eta reduce”#-} 或 {-#HLINT忽略“Eta reduce”#-} 或 {-HLINT忽略“Eta reduce”-} -忽略本模块中的所有eta减少建议。 {-#ANN myDef“HLint:忽略”#-} 或 {-#HLINT忽略myDef#-} 或 {-HLINT忽略myDef-} -不要在定义中给出任何提示 我的定义 。这可以与提示名称相结合, {-HLINT忽略myDef“Eta reduce”-} ,只忽略该定义中的提示。 {-#ANN myDef“HLint:error”#-} 或 {-#HLINT错误myDef#-} 或 {-HLINT错误myDef-} -定义中的任何提示 我的定义 是一个错误。 {-#ANN模块“HLint:error使用concatMap”#-} 或 {-#HLINT错误“使用concatMap”#-} 或 {-HLINT错误“使用concatMap”-} -使用的提示 concatMap(连接地图) 是一个错误(您也可以使用 警告 或 建议 代替 错误 其他严重级别)。
. The
-忽略:{name:Eta-reduce} -抑制所有eta减少建议。 -忽略:{name:Eta reduce,位于:[MyModule1,MyModule2]}内 -在中取消eta缩减提示 我的模块1 和 我的模块2 模块。 -忽略:{within:MyModule.myDef} -不要在定义中给出任何提示 我的模块.myDef . -错误:{within:MyModule.myDef} -定义中的任何提示 我的模块.myDef 是一个错误。 -错误:{name:使用concatMap} -使用的提示 concatMap(连接地图) 是一个错误(您也可以使用 警告 或 建议 代替 错误 其他严重级别)。
#ifndef公司 __HLINT公司__ foo公司 = ( -- HLint将无法解析此
#结尾
- 警告 : {lhs:concat(映射f x),rhs:concatMap f x}
$ hlint--查找=src/Utils.hs
--在src/Util.hs中找到的提示
-警告:{lhs:“null(intersect a b)”,rhs:“disjoint a b”}
-警告:{lhs:“dropWhileisSpace”,rhs:“trimStart”}
-固定:“infixr 5!:”
- 扩展 : - 违约 : 假 - 名称 : [DeriveDataTypeable,GeneralizedNewtypeDeriving]派生数据类型 - {name:CPP,位于:CompatLayer}内
- 功能 : - {name:nub,位于:[]}内 - {name:unsafePerformIO,位于:CompatLayer}内
- 模块 : - {name:[Data.Set,Data.HashSet],作为:Set} - {name:Control.Arrow,位于:[]} - {name:Control.Monad.State,错误标识:[modify,get,put],消息:“改用Control.Monad.State.Class”} - {name:控件异常,仅限:[异常],消息:“改用UnliftIO.Exception”}
要求的所有导入 设置 必须是 合格数据。 设置为集合 ,加强一致性 确保模块 控制。 箭头 不能在任何地方使用 防止从中显式导入给定标识符 控制。 莫纳德。 州 (例如,防止人们导入重新导出的标识符)。 阻止所有从 控制。 例外 ,除 例外
-
根据需要 :布尔值。 如果为真, 作为 别名是必需的。 忽略,如果 作为 为空。 -
导入样式 :其中之一 “合格” , “不合格” , “显式” , “explicitOrQualified” , “无限制” . 首选导入样式。 显式或限定 接受两者 输入Foo(a,b,c) 和 进口合格Foo ,但不是 导入Foo 或 导入Foo隐藏(x) . 明确的 基本相同,但不接受 进口合格 . 有资格的 和 不合格的 根本不关心导入列表。 -
限定样式 :或者 “前” , “发布” 或 “无限制” ; 模块应该如何鉴定? 此选项还影响建议的格式。
- 模块 : - {name:[Data.Set,Data.HashSet],as:设置,asRequired:true} - {名称:调试,导入样式:explicitOrQualified} - {name:不安全,importStyle:合格,合格Style:post,as:不安全} - {name:序曲,导入样式:不合格}
要求 数据。 设置 和 数据。 哈希集 要使用别名导入 设置 ; 如果导入时没有别名,则会生成警告。 是这么说的 调试 必须通过资格后审,即。 导入调试合格 ,或带有显式导入列表,例如。 调试(debugPrint) . 需要这样做 不安全的 必须始终导入合格的,并且不能使用别名。 禁止 进口合格前奏曲 和 进口前奏曲合格 (有或没有显式导入列表)。
- 模块 : - {name:[Data.Map,Data.Map.*],作为:Map} - {name:Test.Hspec,在:**.*规范内} - {名称:“**”,导入样式:帖子}
{-
检查zipFrom提示的测试有效
<测试>
zip[1..长度x]x--zip从1 x
拉链[1..长度y]x
拉链[1..长度x]x--@ 警告
</测试>
-}