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入門資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM