Windows 下 Haskell-stack 开发环境搭建


An advanced, purely functional programming language

抛却「Haskell 语言能装逼」这一光环,笔者认为学习 Haskell 的另一主要动机在于尝试体验另一种编程思维,即「做什么」而非「怎么做」,Haskell 写出的程序更像是人脑的思维而不是机器的思维。当然了,装 x 也 hin 重要。

目前 Haskell 官方下载页 推荐三种下载方案:

总体而言,Haskell 在 *nix / OS X 操作系统下的生态优于 Windows 环境,但对于熟悉 Windows 操作、醉心于各类工具流的笔者而言,必须要在 Windows 系统下完成环境搭建。为方便后续各类包的安装更新等操作,这里采用 Cabal 的替代品 – stack。以下诸多关键操作均参考 Arvind Devarajan 的博客

预热

在 Windows 操作系统环境中,如果没有设定环境变量 STACK_ROOT,则通过 stack 下载的程序文件以及包快照会被存放在 %LOCALAPPDATA%\Programs\stack 以及 %APPDATA%\stack 目录下。经常变动的包安放在系统盘总会令人不安,也不便于管理。所以在首次使用 stack 之前,应设定环境变量 STACK_ROOT,这里笔者将其设为 F:\HaskellStack。另外推荐设定编译器 GHC 的下载安装目录,见后文 config.yaml 文件的配置。(stack 帮助文档关于此问题的说明

配置

这里有几点关于我个人在开发过程中的习惯配置。

  • 提前安装好 MSYS2 作为 C/C++ 等工具的开发环境,并添加至环境变量 PATH。详细配置过程见 MSYS2 的日常操作
  • 将一个包含常用可执行文件的目录加入环境变量 PATH,如 F:\WorkingDirectory\Bin

stack 默认使用的软件源在国外,这里换上国内的清华大学开源网站镜像。由于之前已设定了 STACK_ROOT 环境变量,首次运行 stack 会在此目录下生成一些文件,修改 config.yaml 文件:

%STACK_ROOT%\config.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
setup-info: "http://mirrors.tuna.tsinghua.edu.cn/stackage/stack-setup.yaml"

urls:
latest-snapshot: http://mirrors.tuna.tsinghua.edu.cn/stackage/snapshots.json
lts-build-plans: http://mirrors.tuna.tsinghua.edu.cn/stackage/lts-haskell/
nightly-build-plans: http://mirrors.tuna.tsinghua.edu.cn/stackage/stackage-nightly/

package-indices:
- name: Tsinghua
download-prefix: http://mirrors.tuna.tsinghua.edu.cn/hackage/package/
http: http://mirrors.tuna.tsinghua.edu.cn/hackage/00-index.tar.gz

skip-msys: true
local-programs-path: F:\HaskellStack\programs
local-bin-path: F:\WorkingDirectory\Bin

以上参考 stackage 镜像使用帮助 以及 hackage 镜像使用帮助。另作几点说明:

  • Windows 下的 stack 会自动安装 MSYS2,由于之前已在机器中安装过,故在配置中跳过 MSYS 的安装
  • 通过 stack install 生成的可执行文件默认在 %APPDATA% 目录下,这里统一放置于之前提到的可执行文件合集目录中

执行 stack setup 下载最新版的 GHC,目前版本为 8.4.3。

如一切顺利,stack path 输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
stack-root: F:\HaskellStack
project-root: F:\HaskellStack\global-project
config-location: F:\HaskellStack\global-project\stack.yaml
bin-path: .;F:\HaskellStack\snapshots\55eb7f36\bin;F:\HaskellStack\compiler-tools\x86_64-windows\ghc-8.4.3\bin;F:\HaskellStack\programs\x86_64-windows\ghc-8.4.3\bin;F:\HaskellStack\programs\x86_64-windows\ghc-8.4.3\mingw\bin;C:\Windows\system32;...
programs: F:\HaskellStack\programs\x86_64-windows
compiler-exe: F:\HaskellStack\programs\x86_64-windows\ghc-8.4.3\bin\ghc.EXE
compiler-bin: F:\HaskellStack\programs\x86_64-windows\ghc-8.4.3\bin
compiler-tools-bin: F:\HaskellStack\compiler-tools\x86_64-windows\ghc-8.4.3\bin
local-bin: F:\WorkingDirectory\Bin
extra-include-dirs:
extra-library-dirs:
snapshot-pkg-db: F:\HaskellStack\snapshots\55eb7f36\pkgdb
local-pkg-db: F:\HaskellStack\global-project\.stack-work\install\620260b6\pkgdb
global-pkg-db: F:\HaskellStack\programs\x86_64-windows\ghc-8.4.3\lib\package.conf.d
ghc-package-path: F:\HaskellStack\global-project\.stack-work\install\620260b6\pkgdb;F:\HaskellStack\snapshots\55eb7f36\pkgdb;F:\HaskellStack\programs\x86_64-windows\ghc-8.4.3\lib\package.conf.d
snapshot-install-root: F:\HaskellStack\snapshots\55eb7f36
local-install-root: F:\HaskellStack\global-project\.stack-work\install\620260b6
snapshot-doc-root: F:\HaskellStack\snapshots\55eb7f36\doc
local-doc-root: F:\HaskellStack\global-project\.stack-work\install\620260b6\doc
dist-dir: .stack-work\dist\7d103d30
local-hpc-root: F:\HaskellStack\global-project\.stack-work\install\620260b6\hpc
local-bin-path: F:\WorkingDirectory\Bin
ghc-paths: F:\HaskellStack\programs\x86_64-windows

最后,如要修改 GHCi 的命令行提示符或在启动时加载某些包,可通过添加 / 修改 %APPDATA%\ghc\ghci.conf 文件为以下内容:

ghci.conf
1
2
3
4
import Text.Show.Pretty (ppShow, pPrint)

:set -interactive-print pPrint
:set prompt "|> "

编辑器

考虑编辑效率和插件生态,推荐使用 VSCode 作为主力编辑器。安装插件:

后两者为代码格式化插件,任选一即可。

hindent-format 貌似不能正确读取配置文件,故手动修改之(当前版本 0.0.8)

hindent-format 插件修改后代码

个人更青睐 brittany 格式化的效果。 但目前 VSCode 插件 brittany 对未保存文档不能正确执行格式化,同样需要修改插件源代码(当前版本 0.0.1)

brittany 插件修改后代码

另外,建议利用 config.yaml 文件搭配 brittany 进行深度配置。在控制台执行一次 brittany 命令,生成的配置文件位置为 %APPDATA%\brittany\config.yaml,示例配置如下。

brittany 配置文件

参考