Windows10 和 VSCode 上Haskell的安装与环境搭建

Windows10 和 VSCode 上Haskell的安装与环境搭建

本人博客园个人首页CSDN个人首页

参考资料:【VS Code】Windows10下VS Code配置Haskell语言环境
在整体的环境安装配置过程中,多处涉及到github链接和需要FQ的链接,部分校园网可能会链接失败,可以尝试手机热点。

1. 下载安装Stack

打开Stack官方文档,选择Windows 64-bit Installer进行下载,双击下载下来的exe文件进行安装,可以自定义C盘路径,但是要以管理员身份运行。

Windows 64-bit Installer

Haskell安装过程1

安装过程中,还会自动将Stack添加到用户环境变量 PATH 中,同时会设置 STACK_ROOT=C:\sr(安装程序的默认选项,记住这个路径,后面要考),安装完成后,可以在cmd终端输入命令“stack --help”来检验安装是否成功。

Haskell安装过程2

2. 安装GHC(麻烦bug多)

Stack可以用于管理Haskell编译器GHC和Haskell库,因此使用Stack安装GHC。

由于Haskell的生态和版本支持不是很好,如果你直接安装而不固定版本号,软件包的安装就容易引起冲突,导致各种依赖项间的不兼容。访问这个网站,查看Haskell最新的LTS,然后锁定在这个LTS上,此处我选择的是最新的LTS 18.27。

Stackage

一些辅助理解的概念(和配置环境关系不大,你可以不看):

  • HackageHaskell社区的开源软件包仓库 The Haskell Package Repository ,可以发布库和程序,或者使用Cabal-install这样的软件包管理器下载和安装软件包。
  • Stackage是 Stable Haskell package sets 的缩写,即稳定一致的Haskell包集合。它是一个Haskell软件包子集的发行版,来自Hackage并和它一同被社区构建起来。Stackage存在的意义在于,它提供了兼容一致且稳定的Haskell包集,每个包都选择了一个特定版本以满足软件包集合的自洽性,从而解决包版本的冲突问题、顺利构建和运行项目。
  • Stackage提供和维护了一堆不同的大版本,每个大版本都对应一个兼容一致稳定的Haskell包集,或者说是一个LTS Long Term Service ,被社区长期支持。我们选定了一个LTS之后,在下载安装时只可能发生某个包不存在的情况,就算出现冲突也能通过Stack来轻松解决,不会埋下一大堆“地雷”。

2.1 配置stack

在cmd终端执行stack install,会发现下载经常失败。

 (ConnectionFailure user error (Network.Socket.gai_strerror not supported: 11004))

这是因为下载过程中的一个网址需要FQ才能访问,在不FQ的情况下,需要进行换源才可以下载成功。

参考资料:关于stack换源的问题

其中提到了两个清华源的网址,“可以同时使用 TUNA 的 Stackage 源 + Hackage 源来解决”,分别是stackage 镜像使用帮助hackage 镜像使用帮助

在stackage 镜像使用帮助中提到“本镜像推荐与 TUNA 的 Hackage 镜像配合使用”,因此两个镜像源都需要添加。

2.2 换源:

在终端输入stack --version查看stack版本,然后在上述两个源链接中分别找到对应版本的源进行更换,我的stack版本是2.7.3,在这里说明我的换源过程:

(1)下载 stackage 镜像中提示的文件:

stackage 镜像

下载图片下方蓝色链接的global-hints.yaml文件,在系统中找到对应的文件夹,不同下载路径对应的文件夹不同,此处的路径就是上文提及的记下来要考的路径:

  • 默认路径下载时,直接在c盘路径输入%APPDATA%,然后回车就可以打开对应文件夹。
    %APPDATA%
  • 我下载的时候更改了默认路径,所以要修改的配置文件是%STACK_ROOT%\config.yaml,配置文件对应的路径是上面记住要考的哪个C:\sr\config.yaml

(2)更换源

现在你已经找到了对应的目录,在此目录下的pantry文件夹内放入刚刚下载好的global-hints.yaml文件,并更改 stack(默认路径)或sr(我更改的路径)目录下的config.yaml,在此文件中增添两个镜像源中对应版本的代码,我的版本是2.7.3:

stack
hackage
即在config.yaml中增加以下代码:

package-indices:
  - download-prefix: http://mirrors.tuna.tsinghua.edu.cn/hackage/
    hackage-security:
        keyids:
        - 0a5c7ea47cd1b15f01f5f51a33adda7e655bc0f0b0615baa8e271f4c3351e21d
        - 1ea9ba32c526d1cc91ab5e5bd364ec5e9e8cb67179a471872f6e26f0ae773d42
        - 280b10153a522681163658cb49f632cde3f38d768b736ddbc901d99a1a772833
        - 2a96b1889dc221c17296fcc2bb34b908ca9734376f0f361660200935916ef201
        - 2c6c3627bd6c982990239487f1abd02e08a02e6cf16edb105a8012d444d870c3
        - 51f0161b906011b52c6613376b1ae937670da69322113a246a09f807c62f6921
        - 772e9f4c7db33d251d5c6e357199c819e569d130857dc225549b40845ff0890d
        - aa315286e6ad281ad61182235533c41e806e5a787e0b6d1e7eef3f09d137d2e9
        - fe331502606802feac15e514d9b9ea83fee8b6ffef71335479a2e68d84adc6b0
        key-threshold: 3 # number of keys required

        # ignore expiration date, see https://github.com/commercialhaskell/stack/pull/4614
        ignore-expiry: no


setup-info-locations: ["http://mirrors.tuna.tsinghua.edu.cn/stackage/stack-setup.yaml"]
urls:
  latest-snapshot: http://mirrors.tuna.tsinghua.edu.cn/stackage/snapshots.json

snapshot-location-base: https://mirrors.tuna.tsinghua.edu.cn/stackage/stackage-snapshots/

(3)配置GHC

回到终端,运行命令stack --resolver lts-18.27 setup下载lts,成功代码如下:

C:\Users\hp>stack --resolver lts-18.27 setup
Warning: http://mirrors.tuna.tsinghua.edu.cn/stackage/stack-setup.yaml: Unrecognized field in GHCDownloadInfo: version
Preparing to install GHC to an isolated location.
This will not interfere with any system-level installation.
Already downloaded.
Downloaded 7z.dll.
Downloaded 7z.exe.
Decompressing ghc-8.10.7.tar.xz...

7-Zip 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18

Processing archive: C:\Users\hp\AppData\Local\Programs\stack\x86_64-windows\ghc-8.10.7.tar.xz

Extracting  ghc-8.10.7.tar

Everything is Ok

Size:       2768711680
Compressed: 434126144
Extracting ghc-8.10.7.tar...
Extracted total of 10342 files from ghc-8.10.7.tar
GHC installed to C:\Users\hp\AppData\Local\Programs\stack\x86_64-windows\ghc-8.10.7\
Downloaded msys2-20210604.
Already downloaded.
Already downloaded.
Decompressing msys2-20210604.tar.xz...

7-Zip 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18

Processing archive: C:\Users\hp\AppData\Local\Programs\stack\x86_64-windows\msys2-20210604.tar.xz

Extracting  msys2-20210604.tar

Everything is Ok

Size:       390021120
Compressed: 99822772
Extracting msys2-20210604.tar...
Extracted total of 17688 files from msys2-20210604.tar
Copying skeleton files.
These files are for the users to personalise their msys2 experience.

They will never be overwritten nor automatically updated.

'./.bashrc' -> '/home/hp/.bashrc'
'./.bash_logout' -> '/home/hp/.bash_logout'
'./.bash_profile' -> '/home/hp/.bash_profile'
'./.inputrc' -> '/home/hp/.inputrc'
'./.profile' -> '/home/hp/.profile'
stack will use a sandboxed GHC it installed
For more information on paths, see 'stack path' and 'stack exec env'
To use this GHC and packages outside of a project, consider using:
stack ghc, stack ghci, stack runghc, or stack exec

测试一下GHC是否安装成功:

C:\Users\hp>stack exec -- ghc --version
The Glorious Glasgow Haskell Compilation System, version 8.10.7

C:\Users\hp>stack exec -- ghci
GHCi, version 8.10.7: https://www.haskell.org/ghc/  :? for help
Prelude> :quit
Leaving GHCi.

到此,我们已经有了一个可用的Stack和GHC(芜湖撒花)。

3.配置VSCode

3.1 安装插件

由于VSCode中的一部分插件版本过老,和新版本的GHC不匹配,因此下载旧版本的GHC做备用,一般来说LTS9不会出现冲突。

在终端执行以下命令进行安装,并检测安装是否成功:

stack --resolver lts-9.21 setup
stack --compiler ghc-8.0.2 exec -- ghc --version

配置完成后,在VSCode扩展中安装以下插件:

  • Haskell ghc-mod
  • Haskell-linter
  • Haskell Syntax Highlighting
  • Haskelly
  • Haskell
  • Code Runner

然后在终端配置插件,分别执行以下命令(这一步所需时间较长,如果一次没配置完,第二次重新打开终端时,需要重新输入chcp 65001

chcp 65001
stack --resolver lts-9.21 install ghc-mod
stack --resolver lts-9.21 install hlint
stack --resolver lts-9.21 install intero QuickCheck stack-run

以上这些安装完成后,终端显示如下,不用管那个Warning,但是要记住他那个路径 C:\Users\hp\AppData\Roaming\local\bin,Stack安装的所有扩展应该都在这个路径中,这个路径在配置settings.json时需要用到。

安装完成

3.2 配置Haskell语言学习环境

(1)配置ghc-mod、hlint、Code Runner

在VSCode中打开 文件(File)- 首项选(Preferences)- 设置(Settings),点击下图红圈的位置,打开settings.json。
设置
settings.json

在settings.json文件中加入以下代码,注意在第8行末尾增加逗号,其中Haskell-linter配置的路径就是上面那个提示的路径。

    /* Haskell ghc-mod配置 */ 
    "haskell.ghcMod.executablePath": "stack",
    /* Haskell-linter配置 */
    "haskell.hlint.executablePath": "C:\\Users\\hp\\AppData\\Roaming\\local\\bin\\hlint.exe",
    /* code-runner配置 */
    "code-runner.executorMap": {
		"haskell": "cd $dir && stack runhaskell $fileName"
	},

settings-over

(2)配置Haskell

由于使用的是Stack,下列配置项要么添加到全局配置文件 $STACK_ROOT\config.yaml 中,要么添加到项目配置文件 stack.yaml 中:

ghc-options:
  '$everything': -haddock # 一个从带注释的Haskell源代码自动生成文档的工具

4. 尝试使用

经过以上操作,haskell的环境基本搭建完毕,写一个简单的Hello World来测试是否成功。在VSCode运行.hs文件基本有以下三种方式:

  • 在终端输入stack runhaskell ".hs文件路径"(最稳定)。
  • 点击右上角的小三角运行按钮。
  • 点击最下面蓝色行用红笔圈出的Run File运行文件。

可以看到成功输出了Hello World。

爷终于成功了哈哈哈哈哈


tips:

在实际使用的过程中,想引用import System.Random时却发现系统提示没有这个模块,在查找了无数资料后,终于在这个网站中找到了可行的解决方案,可以尝试在终端输入下面的第一行代码,如果无效则尝试第二行代码:

stack install random
stack ghci --package random

附:一些个人认为比较有用的Haskell入门资料

posted @ 2022-03-08 10:37  一只小十七  阅读(1169)  评论(0编辑  收藏  举报