Haskell 代码格式化程序(Fourmolu / Ormolu 风格)
指导
Haskell 代码格式化程序(Fourmolu / Ormolu 风格)
粘贴原始的 Haskell 源代码,即可获得格式化后的代码,其风格为确定性、受 Fourmolu / Ormolu 风格启发的代码——具有统一的运算符间距、排序的 LANGUAGE 语句、分组的导入语句,以及制表符被转换为空格。所有操作均在您的浏览器中运行,因此您的源代码永远不会离开您的机器。
如何使用
- 上传一个
.hs文件或粘贴您的 Haskell 源代码到输入框(使用“尝试示例”链接获取快速示例)。 - 选择您的缩进大小——2 个空格(Fourmolu 默认)或 4 个空格(Ormolu 默认)。
- 设置用于标记过长行的最长行长度(默认为 100)。
- 切换 排序导入, 对 LANGUAGE 语句进行排序和去重,并且 合并空行 以匹配您项目的风格规范。
- 格式化输出会自动出现并带有语法高亮;您可以使用复制或下载功能获取结果。
特征
- 确定性间距 ——为
=,::,->,<-,=>,$,++、比较运算符以及 Applicative / Monad 组合器(如<$>,<*>,>>=. - 语句规范化 ——将每个
{-# LANGUAGE ... #-}语句移至文件顶部,将组合的语句拆分为每行一个扩展,按字母顺序排序,并移除重复项。 - 导入排序 ——按模块名称对连续的
import语句进行字母顺序排序,同时保持非限定/限定分组的约定。 - 布局安全 ——保留用户的首行缩进(Haskell 的布局规则具有语义重要性),同时使用选定的缩进宽度将制表符转换为空格。
- 注释安全的词法分析器 ——正确处理行注释(
--)、嵌套块注释({- ... -})、语句、带转义的字符串和字符字面量,以确保其中的运算符字符不会被错误处理。 - 括号与块验证 ——标记未匹配的括号、方括号、大括号和未终止的块注释,并显示行号。
- 长行报告 ——突出显示任何超过您配置的最大宽度的行,以便您在审查前进行重构。
- 100% 客户端 ——您的代码完全在浏览器中处理;不会上传、记录或存储。
常问问题
-
Ormolu 和 Fourmolu 有什么区别?
Ormolu 是一个严格且有明确偏好的 Haskell 格式化工具,几乎没有任何配置——每个由 Ormolu 格式化的项目看起来都相同。Fourmolu 是 Ormolu 的一个分支,提供了少量风格调节选项(缩进大小、逗号位置、首尾逗号、记录大括号间距),适用于希望拥有与上游 Ormolu 不完全相同但又保持一致风格的团队。两者共享相同的解析器和基于 AST 的方法,因此都能生成可靠的 Haskell 代码。
-
为什么通用 AI 难以处理 Haskell 格式化?
Haskell 使用“偏侧规则”——缩进具有语义重要性,决定了 let、where、do 和 case ... of 的块开始和结束位置。格式化工具必须理解解析树,而不仅仅是词法流,才能安全地重新缩进而不改变程序的含义。通用语言模型将代码视为文本进行推理,经常生成与输入不同的缩进,尤其是在处理嵌套 where 子句和多行 lambda 表达式时。
-
什么是 LANGUAGE 语句?
LANGUAGE 语句是一种形式为 {-# LANGUAGE ExtensionName #-} 的指令,放置在 Haskell 源文件的顶部,以启用该模块的 GHC 语言扩展——例如 OverloadedStrings、ScopedTypeVariables 或 TypeApplications。语句可以组合使用({-# LANGUAGE A, B, C #-}),但大多数风格指南建议每行一个扩展,并按字母顺序排序,以便于差异对比。
-
为什么限定导入通常被单独分组?
惯例将限定导入(import qualified Data.Map as M)放在普通导入(import Data.List)之后,这样读者可以先扫描非限定名称,从而一眼看出哪些模块是通过别名访问的。这是 stylish-haskell、Ormolu 和 Fourmolu 默认的布局,当项目添加或移除限定别名时,也能将合并冲突局部化。
