Haskell 格式化器 Tilia 的运算符优先级推断
来源: markkarpov.com — 2026-09-16
概述
Haskell 一直难以格式化,作者认为三个老大难是注释处理、运算符链的优先级推断与 CPP 支持。他新写的格式化器 Tilia 试图用有原则的方式一次解决三者,文章重点讲优先级与 CPP:面对自定义 fixity,他没有维护硬编码数据库,而是与 GHC 和 Cabal 打交道拿真实信息——已安装的包读接口文件,未安装的则下载源码包自己挖,并沿再导出图一路处理循环。为处理 import 带入的构造子,还得跟踪命名空间与 import 的写法。
核心要点
- 两种获取 fixity 的办法中,他选了几乎没人尝试过的第二种:直接向 GHC 与 Cabal 要真实信息。
- 已安装的依赖可以读接口文件直接拿到 fixity,未安装的则须先取源码 tarball 从源码里挖。
- 难点在于 import 列表只提到类型,类型上的 (..) 才会把运算符带进作用域,仅知道模块导出了哪些名字并不够。
- 因此必须跟踪再导出及其环、子项(构造子、字段、类方法)、命名空间与 import 的具体写法。
- 同名运算符在不同命名空间可能有不同 fixity,遇到歧义必须报告而不能猜。
金句
如果你想要绝对正确与精确的承诺,就不能忽略任何东西。
👍 0
👎 0
返回 Lobsters 首页