使用 Docker 搭建 Haskell 開發(fā)環(huán)境

最近又又又又開始學(xué)習(xí) Haskell,之前學(xué)習(xí)的時(shí)候都使用單文件的形式,這對(duì)使用第三方庫(kù)產(chǎn)生了很大的障礙(最終也沒學(xué)下去),最近研究了通過 Docker 去配置 Haskell 環(huán)境的方式(應(yīng)也適用于linux),這里記錄一下,并且同時(shí)也去使用 Stack 創(chuàng)建空項(xiàng)目和 Yesod 項(xiàng)目、配置plfa環(huán)境。
前置條件:
安裝 Docker
安裝 VS Code,以及 Dev Containers 擴(kuò)展
閑
創(chuàng)建 linux 容器,安裝依賴
首先要?jiǎng)?chuàng)建 linux 容器,使用 fedora 做例子:
我曾嘗試過 ubuntu鏡像,但其在創(chuàng)建 Yesod 項(xiàng)目的時(shí)候遇到奇怪的編碼問題(表現(xiàn)在編譯language-javascript庫(kù)時(shí)getContents報(bào)錯(cuò)),應(yīng)該是系統(tǒng)區(qū)域相關(guān)的玩意被裁剪的原因
然后打開本機(jī)的 VSCode,點(diǎn)擊左下角藍(lán)色圖標(biāo),選擇 Attach to Running Container,選擇該容器。
打開后,參考https://mirrors.ustc.edu.cn/help/fedora.html,執(zhí)行:
安裝 Ghcup,修改 Ghcup,cabal,stack 源
參考https://mirrors.ustc.edu.cn/help/ghcup.html。
首先安裝 ghc 所需依賴:
執(zhí)行下面的命令,一路 y 下去:
如果上面這個(gè)命令出現(xiàn)了奇怪的錯(cuò)誤,或許得使用官方的腳本(注意網(wǎng)絡(luò)):
安裝后,嘗試執(zhí)行 ghci:
bingo!
配置 Ghcup,Cabal,Stack 源
這節(jié)參考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
一行,編輯為:
然后執(zhí)行下列命令:
使用 Stack 創(chuàng)建項(xiàng)目
執(zhí)行stack new project-name
可以創(chuàng)建空項(xiàng)目,創(chuàng)建后進(jìn)入該文件夾,執(zhí)行stack build
檢查是否正常。
執(zhí)行stack build
若出現(xiàn)”Could not load module ‘Distribution.Simple’”的錯(cuò)誤,移除~/.ghc/相應(yīng)版本 GHC/environments/default
應(yīng)當(dāng)能解決,參照https://stackoverflow.com/questions/70994294/problem-with-loading-module-distribution-simple。
給 VSCode 安裝 Haskell 擴(kuò)展,打開項(xiàng)目目錄并打開特定 hs 文件就應(yīng)當(dāng)可以開始編碼了,可以嘗試打開 src/Lib.hs 文件,起空行輸入-- >>> show "Aloha"
,若出現(xiàn) Evaluate 按鈕則證明工作正常。
添加依賴
添加依賴時(shí)不要使用 cabal,可能會(huì)出現(xiàn)上一節(jié)的問題
但這還不夠,如果能識(shí)別到 Stack 項(xiàng)目的依賴并給與補(bǔ)全才更好。
編輯 package.yaml,在 dependencies 配置下加入 random 依賴:
然后,執(zhí)行stack build
,在另起一個(gè)文件 Playground.hs,添加下添加下列內(nèi)容,導(dǎo)入所有所需依賴并點(diǎn)擊 Evaluate:
不管你能不能跑,反正我是能跑了 w。
使用 Stack 創(chuàng)建 Yesod 項(xiàng)目
參考https://www.yesodweb.com/page/quickstart,執(zhí)行 stack build
的時(shí)候會(huì)出錯(cuò),查詢?nèi)罩景l(fā)現(xiàn)缺失 zlib 頭文件,使用 dnf 安裝zlib-static
, zlib-devel
兩個(gè)依賴即可。
執(zhí)行完畢后,創(chuàng)建文件src/HelloWorld.hs
,粘貼下面的代碼(這類型安全的html模板和路由定義,震撼):
然后,執(zhí)行stack runhaskell src/HelloWorld.hs
,在本機(jī)訪問localhost:8080
,若能成功訪問,bingo!
配置plfa環(huán)境
參考https://agda-zh.github.io/PLFA-zh/GettingStarted,以及https://schneide.blog/2020/09/21/compiling-agda-2-6-2-on-fedora-32。
執(zhí)行下面的命令去:
安裝git
對(duì)一個(gè)系統(tǒng)庫(kù)進(jìn)行鏈接(Haskell為什么這么麻煩?)
安裝agda
獲取agda標(biāo)準(zhǔn)庫(kù)和plfa庫(kù)
拷貝庫(kù)到指定位置