VSCode 运行 Haskell 依赖本地命令而非内置执行器,需正确配置 ghcup、PATH 及 tasks.json;单文件用 runhaskell,项目需 HLS 加载上下文并验证 .cabal 或 stack.yaml 结构。

VSCode 本身不运行 Haskell,靠的是系统命令
VSCode 没有内置 Haskell 运行器,所谓“运行”实际是调用你本地装好的 runhaskell、ghci 或构建后的可执行文件。插件只负责语言服务(类型提示、跳转),不提供执行能力。点 F5 没反应、右键菜单没“Run”选项——不是插件问题,而是底层命令不可用或路径没配对。
先验证基础是否就位:在 VSCode 集成终端里执行 runhaskell --version 或 ghci --version。如果报 command not found,说明 ghcup 没装全,或 ~/.ghcup/bin(Linux/macOS)/ %USERPROFILE%\.ghcup\bin(Windows)没进系统 PATH。
- macOS/Linux 用户别用
brew install ghc——它通常不带runhaskell;推荐统一用ghcup安装 - Windows 用户注意:PowerShell 默认禁止脚本执行,且新终端可能不加载
ghcup写入的环境变量,建议重启终端并手动运行$env:PATH = "$env:USERPROFILE\.ghcup\bin;" + $env:PATH -
runhaskell只适合单文件脚本(无外部依赖),不能替代项目构建流程
用 tasks.json 跑单个 .hs 文件(新手最快方式)
不需要项目结构,适合练语法或写小工具。关键是让 VSCode 调用 runhaskell 并传入当前文件路径。
在项目根目录(哪怕只是空文件夹)建 .vscode/tasks.json,内容如下:
{
"version": "2.0.0",
"tasks": [
{
"label": "Run Haskell File",
"type": "shell",
"command": "runhaskell",
"args": ["${file}"],
"group": "build",
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared",
"showReuseMessage": true,
"clear": true
}
}
]
}
-
${file}是当前编辑的完整路径,确保该文件含main :: IO ()且无未声明的import - 按
Ctrl+Shift+P→ 输入Tasks: Run Task→ 选Run Haskell File - 不要用
code Main.hs打开单文件——必须用File → Open Folder打开包含tasks.json的文件夹
跑真实项目必须让 HLS 加载上下文
带依赖的项目(比如用了 text 或 aeson)无法靠 runhaskell 直接运行,因为缺少构建上下文。此时真正起作用的是 stack run 或 cabal run,而它们能否被 VSCode 正确触发,取决于 HLS 是否已就绪。
- 项目根目录必须含
.cabal(如myproj.cabal)或stack.yaml,且文件名与项目名一致 - 必须用
File → Open Folder打开整个项目根目录,不能打开子目录(如src/) - Stack 用户需至少运行一次
stack build,生成.stack-work/;Cabal 用户确保cabal build成功过 - 右下角状态栏出现
HLS ready,且输出面板Haskell标签页有Run entered for haskell-language-server日志,才算上下文加载成功
为什么配置了 tasks 却还报 Could not find module
常见于文件里写了 import Data.Text,但 .cabal 的 build-depends 没加 text。VSCode 不会主动检查依赖声明,runhaskell 在无上下文时直接失败,且错误信息模糊。
- 单文件场景:删掉所有
import,只留Prelude里的东西,确认runhaskell能跑通 - 项目场景:检查
.cabal中build-depends:下是否列出所有用到的包;Stack 用户检查stack.yaml的dependencies:部分 - 别指望 VSCode 自动补全或悬停能帮你发现缺失依赖——HLS 启动失败时,这些功能全失效,得先解决服务器路径和项目结构问题
最常被忽略的点:VSCode 设置里填了 haskell.serverExecutablePath 后,必须关掉整个窗口再重开,仅重载窗口无效;还有就是 Windows 用户的 PowerShell 执行策略和 PATH 加载时机,这两处卡住的人最多。


















