haskell 在 sublime text 中无法运行的根本原因是 ghc 和 hls 未正确安装与配置:需用 ghcup 安装匹配版本的 ghc 并将其路径加入系统 path,同时确保项目根目录存在 .cabal 或 package.yaml 文件以启动 hls;sublime 默认构建系统仅支持单文件脚本,多文件项目应使用 stack run 或 cabal run。

Haskell 在 Sublime Text 里跑不起来,不是插件没装对,而是 GHC 和 HLS 没就位——光装 stack 或 cabal 不等于有编译器,ghci 找不到就根本没法交互。
确认 GHC 是否真正可用
Sublime 不自带 Haskell 运行时,所有“运行”“REPL”功能都依赖系统 PATH 能直接调到 ghci 和 ghc。很多人卡在这一步却以为是插件问题。
- 终端执行
ghci --version,有输出(比如The Glorious Glasgow Haskell Compilation System, version 9.6.4)才算 GHC 就绪 - 没输出?别用系统包管理器(如 apt/yum)装 GHC——版本错乱、路径分散、PATH 不生效;改用
ghcup安装:curl -sSL https://get-ghcup.haskell.org | sh - Windows 用户注意:
ghcup默认把 GHC 装进 PowerShell PATH,但 Sublime 继承的是 CMD 环境变量;必须手动把%USERPROFILE%\ghcup\bin加进系统 PATH,并彻底关闭再重启 Sublime(reload project 不够)
haskell-language-server(HLS)必须启动且项目结构合规
LSP 补全、跳转、hover 类型这些功能全靠 haskell-language-server,但它不是“装上就灵”,而是一套需要显式启动+项目识别的后端服务。
- 终端运行
haskell-language-server --version,应返回类似haskell-language-server version: 2.10.0.0 (GHC: 9.6.4)—— 版本必须和 GHC 严格匹配,否则静默失败 - 项目根目录下必须存在
.cabal文件或package.yaml;没有这两个文件,HLS 启动后立即退出,LSP 功能全部失效(不会报错,只是没反应) - 如果用 Stack,确保
stack build能成功;HLS 会读取stack.yaml解析依赖,但前提是stack已安装且在 PATH 中
放弃 Ctrl+B 构建多文件项目
Sublime 默认的 Haskell 构建系统只调 runhaskell,它只能处理单文件、无 import 的脚本。真实项目一碰 import Data.Text 就报 Could not find module,这不是配置问题,是能力边界。
- 单文件练习:加
{-# LANGUAGE NoImplicitPrelude #-},只用Prelude里的东西,runhaskell才可能稳 - 正式项目:别折腾构建系统,直接终端里
stack run或cabal run;非要集成进 Sublime,就写个自定义Haskell-Stack.sublime-build,关键字段必须设"working_dir": "${project_path}",否则子目录下构建全错 - 网上流传的“一键 build system” JSON 多数漏掉
working_dir和selector,在非根目录打开文件时,${file_path}指向错误位置,导致找不到.cabal
LSP 卡顿不是 Sublime 的锅
刚打开项目时补全慢、跳转延迟、hover 不出类型,大概率是 haskell-language-server 还在解析依赖树。首次加载常耗时 20–40 秒,期间所有 LSP 功能冻结——这是正常行为,不是卡死。
- 检查 HLS 日志:Sublime →
Preferences → Package Settings → LSP → Settings,开"log_stderr": true,看控制台输出是否卡在Indexing... - 别反复重启插件或 Sublime,这只会让索引从头开始;等它完成一次,后续编辑就快了
- 如果持续卡住超过 2 分钟,检查
haskell-language-server版本是否与 GHC 匹配,以及项目里有没有stack.yaml指向不存在的 resolver
最容易被忽略的点:HLS 启动依赖项目根目录的 .cabal 或 package.yaml,但 Sublime 不提示缺失——它只是安静地不工作。打开项目前先 ls -a 确认这两个文件在哪儿,比调半天设置有用得多。











