Haskell 在 macOS 下的環境搭建

Haskell 作為一個冷門語言,并沒有一個簡單好用傻瓜式的 IDE。所以筆者記錄了自己搭建環境的過程,希望對大家有所幫助。

準備工作

  1. 一個好的網絡環境,至少與 GitHub 保持通暢連接
  2. Homebrew

開發環境的搭建

編譯器(GHC)、解釋器(GHCI)等 Haskell 工具鏈

在筆者踩過無數坑之后,無腦推薦Haskell Stack,喜歡挑戰的讀者可以自行嘗試使用 GHC+GHCI+Cabal開發環境
brew install haskell-stack

編輯器

目前主流的編輯器有 vim, emacs, sublime, atom, visual studio code 等,筆者平日開發中只在修改配置文件或者替換某個字符串時用到它們故先按下不表。

IDE

因為宇宙最強 IDE——Visual Studio在 Mac 上發力較晚并表現不佳,故筆者建議使用IntelliJ IDEA(雖說筆者非常討厭 Java 這門語言,但是不得不承認 Java 寫出來的工具還是有不少好用的)

HaskForce

IntelliJ IDEA 有兩個第三方插件提供了對 Haskell 的支持,筆者建議使用評分較高的HaskForce,目前這款插件已經無人維護(存疑,但也側面反映了 Haskell 社區的現狀)

  • 安裝

    1. 在 IntelliJ IDEA 中按下 ? + , 進入偏好設置界面
    2. Plugins > Browse repositories > HaskForce

  • 使用
    由于 HaskForce 插件自身的局限性,需要在終端中通過 Haskell Stack 創建項目。

    1. stack new 項目名稱 模版名稱 路徑(默認當前路徑)
    2. cd 項目名稱
    3. stack setup
    4. stack build

注意如果在創建項目中提示參數不足的警告,可以在~/.stack/config.yaml 中配置

templates:
    params:
        author-name: your-name
        author-email: your-email
        copyright: "Copyright (c) 2018 0x11901"
        github-username: "0x11901"
        category: categories

不建議在此寫死模版名稱,如果不是很確定要用什么模版,可以在新建項目時傳 simple

  • 使用 IntelliJ IDEA 導入創建的 Haskell Stack 項目
  1. 路徑選擇項目的根目錄,注意一下是不是選擇了 Stack 模塊
  2. 然后一直下一步
  3. 配置下 configurations
  4. > add > Haskell Stack Run > Executable: 項目名稱
  5. Executable 一定要填寫
  • 點擊 run 就能運行你的 Haskell 程序了!

相關工具

如果僅僅只有這些雖然就能愉快的編碼了,但是筆者認為是完全不夠的。畢竟如果沒有代碼格式化工具和靜態代碼分析工具,筆者是不會寫代碼的。所以怎么能少了這些呢?。?!
剛好 HaskForce 整合了 hlint, ghc-mod, hindente 等相關 Haskell 工具,可以很好地與 IntelliJ IDEA 結合。它們的安裝也十分簡單,可以直接使用 Haskell Stack 安裝,當然 hlint 也可以使用 Homebrew 安裝,不過筆者建議使用統一的安裝方式方便將來管理。

stack install hlint hindente stylish-haskell

其中 ghc-mod 的安裝值得特別說一下,目前新建的 Haskell Stack 工程默認的 resolver 是 lts-11.6 , 其 GHC 的版本號是 8.2.2 , 而 ghc-mod 的主工程由于技術問題一直沒有支持這套環境,所以想要成功編譯出來是很麻煩的。所以如果大家想使用這款令人愉悅的黑客工作,可以按照下列步驟來編譯。

1. 推薦建立一個獨立的目錄來存儲接下來要使用的文件,編譯完成后即可刪除
2. cd 你剛剛建的目錄
3. git clone https://github.com/DanielG/ghc-mod.git -b ghc802
4. git clone https://github.com/DanielG/cabal-helper.git
5. cd ghc-mod ; touch stack.yaml

因為通過 Haskell Stack 來編譯 ghc-mod 需要配置一個 stack.yaml , 所以用你最喜歡的編譯器打開 stack.yaml 并寫上下面的內容:

resolver: lts-11.6 # current resolver

packages:
    - location: .
    - location: ./core # seems like ghc-mod-core got integrated
    - location: ../cabal-helper
      extra-dep: true

extra-deps:
    - extra-1.6.6 # escapeJSON was missing with 1.5.3
    - monad-journal-0.7.2
    - optparse-applicative-0.13.2.0
    - unix-compat-0.4.3.1
    - either-4.4.1.1
    - cabal-plan-0.3.0.0

flags: {}

extra-package-dbs: []

allow-newer: true # so it builds / too lazy to pinpoint exact versions

現在在當前目錄使用 stack install 命令即可正常編譯出 ghc-mod 與 ghc-modi 并會被放在 ~/.local/bin 目錄下,你可以將這個目錄加入 shell 的環境變量中也可以把它們移到已經加到 shell 的環境變量的目錄下。

最后打開 IntelliJ IDEA 的進入偏好設置界面界面,找到 Haskell Tools 一欄,然后找到你想要使用的工具,點擊 Auto Find 按鈕然后確認,就能在 IntelliJ IDEA 使用這些工具了!

Haskell IDE Engine

筆者最近在 GitHub 上發現了這個新項目,相對于 HaskForce 無人維護的狀態,該項目正在如火如荼地開發中。正如該項目介紹所說,這款 Haskell 引擎筆者分析集成了上述所說的所有工具,而且安裝配置更加傻瓜化。考慮到維護性,筆者建議考慮配置 Haskell 環境的同學應使用這個解決方案。

Haskell IDE Engine 與 Visual Studio Code 集成

從 Haskell IDE Engine 的介紹中可以看出,作者是按照“編輯器 + HIE”這種模式來設計的,故這次筆者嘗試了 Haskell IDE Engine + Visual Studio Code 的組合。選擇 Visual Studio Code 的原因主要是免費,畢竟筆者很窮。
他們的集成也很簡單:
先從 VSCode 市場 安裝 Haskell Language Server ,然后再自行編譯 HIE。
可以根據自己所用的 GHC 版本選擇編譯 HIE , 但是根據 Haskell Language Server 的說法,建議全部編譯,故筆者選擇全編譯:

git clone https://github.com/haskell/haskell-ide-engine --recursive
cd haskell-ide-engine && make build-all
  • 需要你的 Haskell Stack version >= 1.7.1
  • 一個流暢的網絡

編譯成功后二進制文件會放在 ~/.local/bin,建議將這個路徑加入到 $PATH 中。
最后只需要打開 VSCode 的偏好設置,在 JSON 中配置一下即可,具體可以看一下 Haskell Language Server 的文檔,基本上默認的配置就可以,但是也有 "languageServerHaskell.useHieWrapper": true 字段可以選擇打開,如果你沒有把 HIE 的二進制文件加入 $PATH 中,還需要配置 "languageServerHaskell.hieExecutablePath": "" 字段。

現在就能使用 VSCode 愉快地擼碼了。

后記

Haskell IDE Engine 還支持很多編輯器,適應性很廣。雖說現在用起來不如 HaskForce + IntelliJ IDEA 的組合,但是已發展的眼光來看,未來應該是 Haskell IDE Engine 占主流地位的。所以筆者建議大家都可以試試,總之目前用著還是比較滿意的,以上。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容