跳到内容

ndmitchell/hlint公司

存储库文件导航

H整数黑客版本 堆叠版本 生成状态

HLint是一个建议对Haskell代码进行可能改进的工具。这些建议包括使用替代函数、简化代码和发现冗余等想法。本文件结构如下:

错误和限制

可以报告Bug在bug跟踪器上。我不打算解决一些问题:

  • HLint一次对每个模块进行隔离操作,因此HLint不知道类型或范围内的名称。这个决定是经过深思熟虑的,允许HLint并行化并在可能不进行类型检查的代码上增量使用。如果正确解析代码需要固定性可以提供.
  • 以下人员的在场序列可能会导致一些提示(即eta-reduction)改变程序的语义。
  • 一些转换后的程序可能需要附加类型签名尤其是当转换触发单态限制或涉及rank-2类型时。在极少数情况下,可能有无处可写所需的类型签名。
  • 有时,HLint会以某种方式更改代码,导致值默认为不同类型,这可能会改变行为。
  • HLint假定单个表达式中的重复相同表达式用于同一类型。
  • 这个可重新绑定语法扩展可能导致HLint建议不正确的更改。
  • HLint可以使用C预处理器标志的知识进行配置,但一次只能看到一组有条件的代码。
  • HLint打开了许多语言扩展,因此它可以解析更多的文档,有时会破坏其他合法的语法-例如。{-#内联foo#-}不适用于魔法哈希,foo$bar(美元)意思不同于TemplateHaskell公司。可以使用禁用这些扩展-XNoMagicHash-XNoTemplateHaskell公司等。
  • HLint不运行任何自定义预处理器,例如。降价上网记录-输出-预处理器,因此使用它们的代码通常无法解析。
  • 一些提示,比如使用常量,不适用于未吊装(即未照明和未装箱)类型。
  • 一些语言扩展,如严格可能会导致某些提示(例如eta减少)不正确。

安装和运行HLint

安装遵循任何Haskell库或程序的标准模式:type阴谋集团更新更新本地黑客数据库,然后电缆安装hlint安装HLint。

安装HLint后,运行hlint源哪里来源是Haskell文件或包含Haskells文件的目录。将在目录中递归搜索以结尾的任何文件.hs(小时).左侧例如,在darcs上运行HLint会得到:

$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)旧

…更多提示。。。

每个提示都说明提示与哪个文件/行相关,它是一个多么严重的问题,提示的描述,它发现了什么,以及您可能想用什么来替换它。对于第一个提示,它建议不要应用凹面(concat)地图另外,最好使用组合函数concatMap(连接地图).

第一个提示被标记为警告,因为使用concatMap(连接地图)优先于两个单独的功能总是可取的。相反,去掉括号可能是一个好主意,但并不总是这样。提示可能是一个建议的原因包括需要额外的导入,这不是每个人都同意的,并且函数只在较新版本的基本库中可用。

任何配置都可以通过.hlint.yaml文件。任何其他文件名,例如.hlint.yml公司,只能显式与一起使用--提示=文件选项。

错误报告:建议的替换应该是等效的-请报告所有未提及的错误建议(作为已知限制)。

建议的用法

HLint的使用通常分为三个不同的阶段:

  1. 最初,运行hlint公司--报告生成报告.html包含HLint发现的所有问题的列表。纠正那些你认为值得纠正的错误,并不断重复。
  2. 一旦你高兴了,就跑hlint公司--默认值>.hlint.yaml,它将生成一个设置文件,忽略当前未完成的所有提示。随着时间的推移,您可能希望编辑列表。
  3. 对于较大的项目,添加自定义提示或规则.

大多数提示在大多数情况下都是一个好主意,但并不是普遍的——需要判断。当为其他人的项目做出贡献时,HLint可以确定要查看的代码片段,但只能进行考虑改进的更改,而不仅仅是为了遵守HLint规则。

持续集成运行

在CI上,您可能希望运行林特。(或hlint源代码如果您只想检查型钢混凝土目录)。为了避免编译成本,您可能希望获取最新的HLint二进制版本.

对于CI系统特拉维斯,测量员Azure管道添加行:

卷曲-sSLhttps://raw.github.com/ndmitchell/hlint/master/misc/run.sh|sh-s.

之后的论点-秒传递给hlint公司,因此修改最终.如果你想要其他参数。此命令适用于Windows、Mac和Linux。

集成

HLint集成到许多地方:

  • 很多编辑器都有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操作代码扫描.

自动应用提示

HLint可以使用--重构标志。如果传递,HLint将在stdout上输出重构文件,而不是打印提示。对于--重构为了工作,有必要重构可从中执行应用重构您的$路径.HLint使用该工具执行重构。

使用时--重构您可以将其他选项传递给重构二进制使用--重构选项标志。一些有用的标志包括-我(替换原始文件)和-秒(在执行提示之前要求确认)。这个--带分辨率标志可用于指定重构二元的。的简单绑定维姆,Emacs公司原子可用。

--重构标志很有用,并非所有提示都支持重构。请参阅hints.md(提示.md)对于不支持重构的提示。

报告

HLint可以生成大量信息,因此很难搜索特定类型的错误。这个--报告标志将导致HLint生成HTML格式的报告文件,可以交互查看。当有多个提示时,建议使用报告。

语言外延

HLint启用大多数Haskell扩展,只禁用那些窃取过多语法的扩展(例如Arrows、TransformListComp和TypeApplications)。可以启用或禁用单个扩展,例如,-X箭头,或-XNoMagicHash.旗帜-XHaskell2010年选择Haskell 2010兼容性。你也可以通过.hlint.yaml公司文件。例如:-参数:[-X箭头].

Emacs集成

Emacs集成由提供艾利克斯·奥特。集成类似于编译模式,允许在错误之间导航。脚本位于hs升.el,并在数据目录中本地安装副本。要使用,请将以下代码添加到Emacs init文件中:

(需要'hs-lint)(化解my-haskell-mode-hook()(local-set-key“\C-cl”'hs-lint)(添加hook“haskell-mode-hook”my-haskell-mode-hok)

GHCi集成

GHCi集成由Gwern Branwen提供。集成允许运行:hlint(输入)从GHCi提示符。脚本位于hlint.ghci公司,并在数据目录中本地安装副本。要使用,请将内容添加到GHCi启动文件.

并行操作

要在4个处理器上运行HLint,请附加标志-j4公司如果n等于物理处理器的数量(可以使用-j个独自一人。

如果您的GHC版本不支持GHC线程运行时,请使用以下命令进行安装:电缆安装--flags=“-threaded”

C预处理器支持

HLint运行cpphs C预处理器在所有输入文件上,默认情况下,使用当前目录作为包含路径,但没有定义宏。可以使用标志修改这些设置--cpp-包括--cpp定义。要禁用C预处理器,请使用标志-XNoCPP公司。C预处理器支持有许多限制:

  • HLint将只检查#如果,基于定义的宏。
  • 任何缺失#包括文件将在控制台上生成警告,但报告中没有信息。

常见问题

用法

为什么编译器不自动应用优化?

HLint并不建议优化,而是建议代码改进——其目的是使代码更简单,而不是使代码执行更快。这个GHC编译器自动应用HLint建议的许多规则,因此HLint建议很少会提高性能。

为什么我有时会得到一个带有提示的“便条”?

大多数提示都是完美的替代,显示这些提示时没有任何注释。然而,一些提示会改变程序的语义(通常是以不相关的方式),但HLint会显示警告注释。假设类型分类法则时,HLint不发出警告(例如==对称)。您可能会看到以下注释:

  • 增加懒惰-例如foldl(&&)为True建议包括此注释。新代码将适用于无限列表,而旧代码则不适用。增加懒惰通常是一个好主意。
  • 减少懒惰-例如(fst a,snd a)建议包括此注释。在求值时,如果a是错误,则新代码将引发错误,而旧代码将生成包含两个错误值的对。只有少量的提示可以减少懒惰,任何依赖于原始代码懒惰的人都会被建议添加注释。
  • 删除错误-例如文件夹1(&&)建议包括纸币删除[]上的错误。新代码将生成真的而旧代码将引发错误。除非您依赖空列表抛出的异常,否则此提示是安全的,如果您确实依赖该异常,建议您添加注释。

错误/警告/建议之间的区别是什么?

每个提示都有一个严重级别:

  • 错误-默认情况下,仅用于分析错误。
  • 警告-例如concat(映射f x)建议concatMap f x作为“警告”严重性提示。从样式的角度来看,应该始终替换凹面(concat)地图具有凹面贴图.
  • 建议-例如x!!0建议头部x作为“建议”严重性提示。通常情况下是表示列表的第一个元素的一种更简单的方法,尤其是在您归纳处理列表时。然而,在表达式中f(x!!4)(x,将中间参数替换为这使得遵循这种模式变得更加困难,这可能是一个坏主意。建议提示通常是值得的,但不应盲目应用。

警告和建议的区别在于个人品味,尤其是我的个人品味。如果你已经对哈斯克尔风格有了很好的理解,那么你应该忽略两者的区别。如果你是一个初学者Haskell程序员,你可能希望先关注警告提示,然后再关注建议提示。

为什么会出现解析错误?

HLint启用/禁用一组扩展名,这些扩展名旨在允许尽可能多的文件进行解析,但有时您需要启用一个附加扩展名(例如Arrows、QuasiQuotes…),或禁用一些扩展名(如MagicHash)以使您的代码能够进行解析。

您可以通过在中指定其他命令行参数来启用扩展.hlint.yaml公司例如:-参数:[-XQuasiQuotes].

如何仅对更改的文件运行hlint?

如果您使用的是git,那么只对更改过的文件运行hlint可能会有所帮助。在非常大的代码基上,这可能会大大加快速度。

{git-diff--diff-filter=d--仅名称$(git合并基HEAD原点/主)--"***.hs(小时)" &&git ls-files-o--不包括标准--"***.hs(小时)";}|xargs hlint公司

因为hlint--重构选项仅在传递单个文件时有效,此方法也有助于在单个命令中重构多个文件:

{git-diff--diff-filter=d--仅名称$(git合并基HEAD原点/主)--"***.hs(小时)" &&git ls-files-o--不包括标准--"***.hs(小时)";}|xargs-I文件hlint文件--refract--重构选项="--inplace—步骤"

配置

为什么HLint不知道我的自定义的固定性!@%$操作员?

HLint知道基库中所有操作符的固定性,也知道其固定性在被lint的模块中声明的操作符,但不知道其他操作符。HLint一次只能处理一个文件,无法解析导入,因此无法从导入的模块中看到固定性声明。您可以通过将固件放在名为.hlint.yaml公司使用语法-固定:“infixr 5!@%$”。您还可以使用--找到在文件中自动生成固定声明列表。

忽略了哪些提示?

默认情况下,某些提示处于禁用状态。一些被配置设置忽略。查看传递的所有提示--显示。此功能通常与--报告它在交互式网页中显示提示,允许按提示进行浏览。

使用了哪些提示?

HLint使用hlint.山药默认情况下,它附带的文件(包含concatMap(连接地图)上面的提示),以及第一个.hlint.yaml公司它在当前目录或其任何父目录中找到的文件。要包含其他提示,请传递--提示=文件名.yaml.

还有其他提示吗?

HLint附带了一些提示组,但默认情况下已禁用。这些是:

  • 未来,建议切换返回对于纯净的.
  • 额外的,它建议替换引入对额外的图书馆.
  • 使用透镜,它建议替换引入对透镜图书馆.
  • use-th-引号,建议使用[|x|]如果可能的话。
  • 概括建议使用更通用的方法,例如。功能性维修计划而不是地图.
  • 广义一致性,这建议使用更通用的方法,但仅当它们更短时,例如。也许是真的成为全部的.
  • 美元这表明b$c美元替换为答:。b美元c.
  • 教学它鼓励一种简单的初学者友好的风格,学习相关的功能。

可以通过传递--with-group=未来或将以下内容添加到您的.hlint.yaml公司文件:

-:{name:未来,已启用:true}

设计

为什么提示不能递归应用?

考虑:

foo xs格式= 凹面(concat)(地图操作xs)

这将建议eta减少到连接。地图操作,然后在进行更改并再次运行HLint之后,将建议使用concatMap(连接地图)很多人想知道为什么HLint没有直接建议concatMap操作。原因有很多:

  • HLint旨在改进代码,并教会作者更好的风格。单独进行修改有助于此过程。
  • 有时这些步骤相当复杂,通过自动组合这些步骤,用户可能会感到困惑。
  • 有时HLint会出错。如果递归地应用建议,则会出现一个错误。
  • 有些人只利用了其中的一些建议。在上面的示例中,使用concatMap是一个好主意,但有时eta缩减不是。通过分别建议它们,人们可以进行选择。
  • 有时转换后的表达式会很大,进一步的提示将应用于结果的某个小部分,这看起来很混乱。
  • 考虑f$(a b)。有两个有效提示,要么删除$,要么删除括号,但只能应用一个。

是否可以在读取的代码中使用杂注注释全球温室气体排放指数(与冲突重载字符串)?

简短回答:是的,它是!

如果语言扩展名重载字符串已启用,全球温室气体排放指数但可能会报告错误消息,例如:

批注产生的不明确类型变量“t0”
防止求解约束“(Data.Data.Data t0)”。

在这种情况下,解决方案是添加::字符串类型注释。例如:

{-#人工神经网络someFunc(“HLint:ignore使用fmap”::String)#-}

请参阅中的讨论第372期.

自定义提示

要自定义HLint给出的提示,请创建一个文件.hlint.yaml公司在项目的根目录中。对于合适的默认运行:

hlint--默认值>.hlint.yaml

此默认配置显示了许多示例(如#评论)如何:

  • 向所有运行添加命令行参数,例如。--颜色-XNoMagicHash.
  • 忽略某些提示,可能在某些模块/函数中。
  • 限制GHC标志/扩展/功能的使用,例如禁止箭头非安全性能IO.
  • 添加其他特定于项目的提示。

您可以看到的输出--默认干净的皮棉在这里但为了一个肮脏的项目--默认输出包含一个额外的警告部分,该部分统计并忽略它找到的任何提示:

#代码当前触发的警告-忽视:{name:“冗余$”}#20个提示-忽视:{name:“未使用的语言杂注”}#29个提示

如果您希望使用Dhall配置语言要定制HLint就是一个例子类型定义.

查找提示的名称

提示以其在帮助消息中显示的字符串命名

例如,如果hlints输出如下警告

./backend/tests/api-tests/src/Main.hs:116:51:警告:冗余==找到:regIsEnabled rr==真也许:regIsEnabled rr(注册已启用rr)

皮棉的名字是冗余==.

您可以使用该名称来引用配置文件中的lint人工神经网络pragmas,请参阅以下部分。

忽略提示

一些提示是主观的,一些用户认为应该忽略它们。一些提示通常是适用的,但有时并不总是有意义的。忽略机制提供了抑制某些提示的功能。忽略指令可以作为杂注写入正在分析的文件或提示文件中。杂注示例如下:

  • {-#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(连接地图)是一个错误(您也可以使用警告建议代替错误其他严重级别)。

对于人工神经网络pragmas把它们放在之后任何进口声明。如果你有重载字符串启用扩展后,您需要为注释指定一个显式类型,例如。{-#ANN myDef(“HLint:ignore”::String)#-}. The人工神经网络杂注还可能增加编译时间或导致比其他要求更多的重新编译,因为它们是由TemplateHaskell公司.

对于{-#HLINT#-}杂注GHC可能会对未识别的杂注发出警告,可以使用-Wno-unrecognized-pragmas公司.

对于{-HLINT-}注释在语法高亮显示中,它们可能被视为注释,这可能导致它们被忽略。

也可以在提示文件中写入忽略指令:

  • -忽略:{name:Eta-reduce}-抑制所有eta减少建议。
  • -忽略:{name:Eta reduce,位于:[MyModule1,MyModule2]}内-在中取消eta缩减提示我的模块1我的模块2模块。
  • -忽略:{within:MyModule.myDef}-不要在定义中给出任何提示我的模块.myDef.
  • -错误:{within:MyModule.myDef}-定义中的任何提示我的模块.myDef是一个错误。
  • -错误:{name:使用concatMap}-使用的提示concatMap(连接地图)是一个错误(您也可以使用警告建议代替错误其他严重级别)。

这些指令按给出的顺序应用,后面的提示将覆盖前面的提示。

您可以选择忽略所有提示-忽略:{}然后有选择地启用你想要的(例如。-警告:{name:使用常量}),但这并不是一个完全顺利的体验(参见#747#748).

最后,赫林特定义__HLINT公司__预处理器定义(带值1),因此有问题的定义(包括不解析的定义)可以通过以下方式隐藏:

#ifndef公司__HLINT公司__foo公司=(--HLint将无法解析此
#结尾

添加提示

暗示暗示凹面贴图可以定义为:

-警告:{lhs:concat(映射f x),rhs:concatMap f x}

此行可以理解为替换concat(映射f x)具有凹面映射f x。所有单字母变量都被视为替换参数。有关更复杂提示的示例,请参阅提供的hlint.山药数据目录中的文件。此提示将自动匹配连接。地图fconcat$映射f x,因此无需提供eta简化的提示变体。提示可能带有标签错误,警告建议表示默认情况下的严重程度。此外,暗示是的同义词建议。如果您提出了有趣的提示,请提交以供包含。

您可以使用--找到标志,例如:

$hlint--查找=src/Utils.hs
--在src/Util.hs中找到的提示
-警告:{lhs:“null(intersect a b)”,rhs:“disjoint a b”}
-警告:{lhs:“dropWhileisSpace”,rhs:“trimStart”}
-固定:“infixr 5!:”

这些提示适合包含在自定义提示文件中。您还可以在提示文件中包含Haskell fixity声明,这些声明也将被提取。如果你只通过--找到标志,则会写出提示,如果您还传递文件/文件夹进行检查,则在检查时会自动使用找到的提示。

提示可以指定更高级的方面,包括名称和附带条件。要查看这些功能的示例和描述,请参阅默认提示文件提示解释模块注释.

限制项目

HLint可以限制允许的Haskell代码,这对于希望实施编码标准的大型项目特别有用-HLint回购本身。作为限制扩展的示例:

-扩展:-违约:-名称:[DeriveDataTypeable,GeneralizedNewtypeDeriving]派生数据类型-{name:CPP,位于:CompatLayer}内

上述区块声明默认情况下不允许GHC扩展,除了派生数据类型通用新型衍生到处都有。这个清洁石油产品仅允许在模块中进行扩展兼容层。很像扩展,您可以使用旗帜以限制GHC_选项允许出现的标志。您还可以禁止某些功能:

-功能:-{name:nub,位于:[]}内-{name:unsafePerformIO,位于:CompatLayer}内

这表明节点函数不能在任何模块中使用,因此代码中禁止使用该函数。这可能是一个好主意,因为大多数人应该使用一个不是O(n^2)(例如。nubOrd编号). 我们还列出了其中的白名单非安全性能IO可以发生,确保可以有一个集中审查的位置来声明所有此类实例。函数名可以限定,例如。数据。列表.标题,但请注意,通过多个导出(例如。也可以从前奏曲)应该通过可能获得的所有路径列出,因为HLint限定的匹配不知道重新导出。

最后,我们可以通过以下方式限制模块的使用:

-模块:-{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).
  • 需要这样做不安全的必须始终导入合格的,并且不能使用别名。
  • 禁止进口合格前奏曲进口前奏曲合格(有或没有显式导入列表)。

可以使用匹配模块名称全球-样式通配符。模块名被视为文件路径,只是模块名中的句点类似于文件路径中的目录分隔符。所以**.*规格将匹配规格,前奏曲规格,数据。列表规范等等。但是*规格不会匹配数据。列表规范因为分离器。请参见filepattern库以获得更详细的匹配描述。

通配符和特定匹配之间的限制是统一的。使用根据需要,导入样式限定样式字段中,更具体的选项优先。将合并列表字段。使用多个通配符匹配时,不能保证它们之间的优先级(但实际上,名称是按相反的字典顺序排序的,第一个优先——这可能意味着更具体的一个更常见)

如果多次指定同一模块根据需要,导入样式限定样式字段,只有第一个定义才会生效。

-模块:-{name:[Data.Map,Data.Map.*],作为:Map}-{name:Test.Hspec,在:**.*规范内}-{名称:“**”,导入样式:帖子}

黑客HLint

欢迎向HLint捐款,如下我的标准供款指南.

如何运行测试

您可以从全球温室气体排放指数通过键入会话:测试或通过运行独立二进制文件的测试电缆运行--hlint--test堆栈运行--hlint--test。更改提示后,需要重新生成hints.md(提示.md)文件包含hlint—生成摘要.

如何添加测试

通过添加括号中的注释,可以将单个提示的新测试直接添加到源文件和提示文件中<测试>代码注释块。以下是一些示例:

{-
检查zipFrom提示的测试有效

<测试>
zip[1..长度x]x--zip从1 x
拉链[1..长度y]x
拉链[1..长度x]x--@警告
</测试>
-}

一般语法为左侧--右侧具有左侧(lhs)成为您希望重写为的表达式相对湿度.缺少相对湿度意味着你不希望有任何线索。此外???允许您在没有特定建议的情况下断言警告,而@标签需要特定的严重性,这两个功能都不太常用。

打印抽象语法

开始处理HLint中的问题通常意味着要检查GHC解析树以了解它的外观(例如,查看如何在其上进行匹配)。给定源程序食品.hs(例如),您可以让GHC打印的AST通过-ddump-parsed-ast标记,例如。ghc-force-recomp-ddump-parsed-ast-c食品.

当你有一个高速同步在您的程序中,经常需要打印它(例如,通过调试。跟踪.Trace). 中的类型高速同步不在显示。并非中的所有类型高速同步输出但当他们来的时候你可以打电话购买力平价得到SDoc公司s.这个成语很常见,以至于有不安全打印.功能显示AstData可以在任何HsSyn公司项以获得类似于的输出转储-上次标志。这个显示AstData该方法优于购买力平价当这两种选择都存在于两个仅在固定性安排上不同的AST中时,前者的表现将有所不同。

生成提示摘要

提示摘要是hlint内置提示的自动生成列表。这可以通过hlint—生成摘要,它将摘要输出到hints.md(提示.md).

致谢

对该计划进行了许多改进尼古拉斯·布罗伯格响应功能请求。此外,许多人提供了帮助和补丁,包括伦纳特·奥古斯森、马尔科姆·华莱士、亨克·扬·范·图尔、格温·布兰文、亚历克斯·奥特、安迪·斯图尔特、罗曼·莱斯钦斯基、约翰内斯·利普曼、伊乌斯汀·波普、史蒂夫·珀塞尔、米切尔·罗森等。