使用 Docker 搭建 Haskell 开发环境

2023-01-17 23:50:13 来源: 哔哩哔哩

最近又又又又开始学习 Haskell,之前学习的时候都使用单文件的形式,这对使用第三方库产生了很大的障碍(最终也没学下去),最近研究了通过 Docker 去配置 Haskell 环境的方式(应也适用于linux),这里记录一下,并且同时也去使用 Stack 创建空项目和 Yesod 项目、配置plfa环境。

前置条件:


(资料图片仅供参考)

安装 Docker

安装 VS Code,以及 Dev Containers 扩展

创建 linux 容器,安装依赖

首先要创建 linux 容器,使用 fedora 做例子:

我曾尝试过 ubuntu镜像,但其在创建 Yesod 项目的时候遇到奇怪的编码问题(表现在编译language-javascript库时getContents报错),应该是系统区域相关的玩意被裁剪的原因

然后打开本机的 VSCode,点击左下角蓝色图标,选择 Attach to Running Container,选择该容器。

打开后,参考https://mirrors.ustc.edu.cn/help/fedora.html,执行:

安装 Ghcup,修改 Ghcup,cabal,stack 源

参考https://mirrors.ustc.edu.cn/help/ghcup.html。

首先安装 ghc 所需依赖:

执行下面的命令,一路 y 下去:

如果上面这个命令出现了奇怪的错误,或许得使用官方的脚本(注意网络):

安装后,尝试执行 ghci:

bingo!

配置 Ghcup,Cabal,Stack 源

这节参考https://mirrors.ustc.edu.cn/help/ghcup.html,https://mirrors.ustc.edu.cn/help/hackage.html,https://mirrors.ustc.edu.cn/help/stackage.html。

(用 vi 或者 VSCode)编辑~/.ghcup/config.yaml,添加:

编辑~/.stack/config.yaml,添加:

编辑~/.cabal/config,找到repository hackage.haskell.org一行,编辑为:

然后执行下列命令:

使用 Stack 创建项目

执行stack new project-name可以创建空项目,创建后进入该文件夹,执行stack build检查是否正常。

执行stack build若出现”Could not load module ‘Distribution.Simple’”的错误,移除~/.ghc/相应版本 GHC/environments/default应当能解决,参照https://stackoverflow.com/questions/70994294/problem-with-loading-module-distribution-simple。

给 VSCode 安装 Haskell 扩展,打开项目目录并打开特定 hs 文件就应当可以开始编码了,可以尝试打开 src/Lib.hs 文件,起空行输入-- >>> show "Aloha",若出现 Evaluate 按钮则证明工作正常。

添加依赖

添加依赖时不要使用 cabal,可能会出现上一节的问题

但这还不够,如果能识别到 Stack 项目的依赖并给与补全才更好。

编辑 package.yaml,在 dependencies 配置下加入 random 依赖:

然后,执行stack build,在另起一个文件 Playground.hs,添加下添加下列内容,导入所有所需依赖并点击 Evaluate:

不管你能不能跑,反正我是能跑了 w。

使用 Stack 创建 Yesod 项目

参考https://www.yesodweb.com/page/quickstart,执行 stack build的时候会出错,查询日志发现缺失 zlib 头文件,使用 dnf 安装zlib-static, zlib-devel两个依赖即可。

执行完毕后,创建文件src/HelloWorld.hs,粘贴下面的代码(这类型安全的html模板和路由定义,震撼):

然后,执行stack runhaskell src/HelloWorld.hs,在本机访问localhost:8080,若能成功访问,bingo!

配置plfa环境

参考https://agda-zh.github.io/PLFA-zh/GettingStarted,以及https://schneide.blog/2020/09/21/compiling-agda-2-6-2-on-fedora-32。

执行下面的命令去:

安装git

对一个系统库进行链接(Haskell为什么这么麻烦?)

安装agda

获取agda标准库和plfa库

拷贝库到指定位置

标签: STACK DOCKER HASKELL CABAL

[责任编辑:]

最近更新