必须安装Haskell(haskell.haskell)和CodeLLDB(调试时需)插件,确保已装ghcup或ghc+cabal,HLS启动失败需手动安装并重启VS Code窗口,标准库跳转需ghcup安装GHC源码包,调试须用CodeLLDB配合cabal build且关闭优化。

VS Code 装什么插件才能写 Haskell
纯靠 VS Code 默认功能写 Haskell 几乎不可行——没有语法高亮、类型提示、自动补全,连 ghci 都没法内嵌启动。必须装对插件,且顺序和配置有讲究。
核心插件只有两个:Haskell(由 Haskell Tool Stack 团队维护,ID 是 haskell.haskell)和 CodeLLDB(仅当需要调试时)。别装网上搜到的旧版 haskelly 或 haskell-linter,它们已弃用或与新版 haskell-language-server(简称 HLS)冲突。
-
Haskell插件会自动下载并管理haskell-language-server(HLS),但前提是你的系统已安装ghcup(推荐)或至少有ghc+cabal;否则插件会卡在“Downloading HLS…”且不报错 - 如果已有
stack项目,插件默认优先用stack启动 HLS;若用cabal,需在项目根目录放hie.yaml显式声明 - Windows 用户注意:PowerShell 默认执行策略可能阻止 HLS 启动,临时运行
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser可解
打开 .hs 文件后没反应?检查 HLS 是否真在跑
插件图标显示“Haskell”绿色勾不代表 HLS 已就绪。常见现象是:文件打开后无高亮、Ctrl+Click 跳不到定义、悬停看不到类型——本质是 HLS 进程根本没起来,或启动失败后静默退出。
打开 VS Code 命令面板(Ctrl+Shift+P),运行 Haskell: Show Logs,重点看三行:
Starting (haskell-language-server)... Run entered for haskell-language-server-wrapper(haskell-language-server-wrapper) Version 2.5.0.0 x86_64 ghc-9.6.3 Started language server:haskell-language-server-9.6.3 --lsp
如果日志停在第一行、或出现 Permission denied / exec: "haskell-language-server-wrapper": executable file not found,说明 HLS 未正确安装。此时手动运行:
ghcup install hls ghcup set hls 2.5.0.0
再重启 VS Code 窗口(不是重载窗口),否则插件仍读缓存路径。
PHP是一种功能强大的网络程序设计语言,而且易学易用,移植性和可扩展性也都非常优秀,本书将为读者详细介绍PHP编程。 全书分为预备篇、开始篇和加速篇三大部分,共9章。预备篇主要介绍一些学习PHP语言的预备知识以及PHP运行平台的架设;开始篇则较为详细地向读者介绍PKP语言的基本语法和常用函数,以及用PHP如何对MySQL数据库进行操作;加速篇则通过对典型实例的介绍来使读者全面掌握PHP。 本书
怎么让 Ctrl+Click 跳转到函数定义(比如 map 或 Data.List.sort)
默认情况下,标准库函数跳转会失败,因为 HLS 没加载 GHC 的源码。这不是插件问题,而是本地没源码包。
- 用
ghcup安装 GHC 时加--source参数(如ghcup install ghc 9.6.3 --source) - 已有 GHC 但没源码?运行
ghc-pkg list查看是否有ghc-9.6.3对应的source行;没有就补装:ghcup install ghc 9.6.3 --source --no-install-ghc - 重启 HLS:命令面板中执行
Haskell: Restart Haskell LSP Server,不要只重载窗口 - 跳转后若显示 “No definition found”,右下角状态栏点 HLS 图标,确认当前加载的是
base包而非空项目
调试 main 函数时断点不命中?别用 Run Without Debugging
VS Code 内置的 Run Code(Ctrl+F5)或终端里手动跑 runhaskell 都无法触发断点。Haskell 调试依赖 CodeLLDB + 编译产物,必须走编译执行流。
步骤如下:
- 确保项目有
.cabal文件(哪怕是最小的executable段),否则CodeLLDB找不到入口 - 在
.vscode/launch.json中配好:"type": "lldb"、"request": "launch"、"program": "./dist-newstyle/build/*/x/main/build/main/main"(路径随 cabal 版本变,可用cabal exec -- which main查) - 断点只能打在
main = do { ... }内部表达式上,不能打在顶层函数(如foo x = x + 1)——LLVM debug info 不支持纯函数断点 - 首次调试前先
cabal build一次,否则launch.json指向的二进制不存在
Haskell 的惰性求值和优化会让某些断点看似“跳过”,关掉优化更可靠:cabal build --ghc-options="-O0 -g"。










