VSCode 中 Haskell 语言支持失效的主因是 haskell-language-server 未被正确加载,需手动配置绝对路径至 serverExecutablePath 并重启 VSCode,且项目根目录须含 .cabal 或 stack.yaml,HLS 版本必须与 GHC 严格匹配。

VSCode 里 Haskell 语言支持失效、类型提示不出现、跳转定义没反应——基本不是插件没装,而是 haskell-language-server 没被正确加载或根本没找到。
为什么 haskell-language-server 总是启动失败
VSCode 的 Haskell 插件默认只在 PATH 中找 haskell-language-server,它不识别 haskell-language-server-wrapper,也不会自动 fallback 到 .ghcup/bin/ 下的真实可执行文件。即使你用 ghcup install hls 成功安装了,VSCode 依然可能卡在 “Starting Haskell language server…” 状态。
- 终端里能跑
haskell-language-server --version,但 VSCode 里报spawn ENOENT或command not found - 悬停函数没类型、
Ctrl+Click跳转灰色、putStrLn下红波浪线但实际能编译 - 输出面板中 Haskell 日志空或只有初始化日志,没有
Run entered for haskell-language-server
必须手动指定 haskell.serverExecutablePath
别信“自动探测”,90% 的环境问题靠这一步解决。路径必须是 haskell-language-server 本体(不是 wrapper),且是绝对路径。
- 先确认真实路径:
Linux/macOS 运行which haskell-language-server
Windows PowerShell 运行Get-Command haskell-language-server - 在 VSCode 设置中搜索
haskell.serverExecutablePath,填入完整路径,例如:/home/username/.ghcup/bin/haskell-language-server(Linux)C:/ghcup/bin/haskell-language-server.exe(Windows) - 填完后必须关闭并**重新打开整个 VSCode 窗口**(不是重载窗口),否则设置不生效
项目根目录必须含 .cabal 或 stack.yaml
HLS 不是全局服务,它按项目启动,且只在识别出有效项目结构时才加载。空文件夹、只放 Main.hs、或用 code src/ 打开子目录,都会导致 HLS 静默退出。
- 新建项目务必在根目录运行
cabal init -n(确保已装cabal)或stack new - 检查文件名是否拼错:
.cabal不是cabal.project,也不是myproject.cabal(应为myproject.cabal且项目名与文件名前缀一致) - 若用 Stack,至少要运行过一次
stack build,让.stack-work/目录生成出来,否则 HLS 可能拒绝加载
Windows 用户特别注意 PATH 和执行策略
PowerShell 默认禁止脚本执行,且新终端不会自动加载 ghcup 写入的环境变量,导致 VSCode 子进程找不到命令。
- 安装时务必勾选 “Add to PATH” —— 否则
ghc --version在 VSCode 终端里也会失败 - 首次安装需在 PowerShell(非管理员)中运行:
Set-ExecutionPolicy Bypass -Scope Process -Force
再执行镜像源安装脚本 - 安装路径避开
C:\(如用D:\ghcup),避免权限和空间限制引发后续构建失败
最常被忽略的一点:HLS 版本必须和 GHC 版本严格匹配。用 ghcup list 查看已安装的 HLS 版本号,再核对当前 ghcup set ghc 指向的 GHC 版本;不匹配时,ghcup install hls <version> 并 ghcup set hls <version> 才算真正对齐。


















