Haskell 在 macOS 下的環(huán)境搭建

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

準(zhǔn)備工作

  1. 一個(gè)好的網(wǎng)絡(luò)環(huán)境闰挡,至少與 GitHub 保持通暢連接
  2. Homebrew

開發(fā)環(huán)境的搭建

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

在筆者踩過無數(shù)坑之后,無腦推薦Haskell Stack长酗,喜歡挑戰(zhàn)的讀者可以自行嘗試使用 GHC+GHCI+Cabal開發(fā)環(huán)境
brew install haskell-stack

編輯器

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

IDE

因?yàn)橛钪孀顝?qiáng) IDE——Visual Studio在 Mac 上發(fā)力較晚并表現(xiàn)不佳夺脾,故筆者建議使用IntelliJ IDEA(雖說筆者非常討厭 Java 這門語言之拨,但是不得不承認(rèn) Java 寫出來的工具還是有不少好用的)

HaskForce

IntelliJ IDEA 有兩個(gè)第三方插件提供了對 Haskell 的支持,筆者建議使用評分較高的HaskForce咧叭,目前這款插件已經(jīng)無人維護(hù)(存疑蚀乔,但也側(cè)面反映了 Haskell 社區(qū)的現(xiàn)狀)

  • 安裝

    1. 在 IntelliJ IDEA 中按下 ? + , 進(jìn)入偏好設(shè)置界面
    2. Plugins > Browse repositories > HaskForce

  • 使用
    由于 HaskForce 插件自身的局限性,需要在終端中通過 Haskell Stack 創(chuàng)建項(xiàng)目菲茬。

    1. stack new 項(xiàng)目名稱 模版名稱 路徑(默認(rèn)當(dāng)前路徑)
    2. cd 項(xiàng)目名稱
    3. stack setup
    4. stack build

注意如果在創(chuàng)建項(xiàng)目中提示參數(shù)不足的警告吉挣,可以在~/.stack/config.yaml 中配置

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

不建議在此寫死模版名稱,如果不是很確定要用什么模版婉弹,可以在新建項(xiàng)目時(shí)傳 simple

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

相關(guān)工具

如果僅僅只有這些雖然就能愉快的編碼了镀赌,但是筆者認(rèn)為是完全不夠的氯哮。畢竟如果沒有代碼格式化工具和靜態(tài)代碼分析工具,筆者是不會寫代碼的商佛。所以怎么能少了這些呢:砀帧!良姆!
剛好 HaskForce 整合了 hlint, ghc-mod, hindente 等相關(guān) Haskell 工具肠虽,可以很好地與 IntelliJ IDEA 結(jié)合。它們的安裝也十分簡單歇盼,可以直接使用 Haskell Stack 安裝舔痕,當(dāng)然 hlint 也可以使用 Homebrew 安裝,不過筆者建議使用統(tǒng)一的安裝方式方便將來管理豹缀。

stack install hlint hindente stylish-haskell

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

1. 推薦建立一個(gè)獨(dú)立的目錄來存儲接下來要使用的文件氮惯,編譯完成后即可刪除
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

因?yàn)橥ㄟ^ Haskell Stack 來編譯 ghc-mod 需要配置一個(gè) stack.yaml , 所以用你最喜歡的編譯器打開 stack.yaml 并寫上下面的內(nèi)容:

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

現(xiàn)在在當(dāng)前目錄使用 stack install 命令即可正常編譯出 ghc-mod 與 ghc-modi 并會被放在 ~/.local/bin 目錄下叮雳,你可以將這個(gè)目錄加入 shell 的環(huán)境變量中也可以把它們移到已經(jīng)加到 shell 的環(huán)境變量的目錄下。

最后打開 IntelliJ IDEA 的進(jìn)入偏好設(shè)置界面界面妇汗,找到 Haskell Tools 一欄帘不,然后找到你想要使用的工具,點(diǎn)擊 Auto Find 按鈕然后確認(rèn)杨箭,就能在 IntelliJ IDEA 使用這些工具了寞焙!

Haskell IDE Engine

筆者最近在 GitHub 上發(fā)現(xiàn)了這個(gè)新項(xiàng)目,相對于 HaskForce 無人維護(hù)的狀態(tài)互婿,該項(xiàng)目正在如火如荼地開發(fā)中捣郊。正如該項(xiàng)目介紹所說,這款 Haskell 引擎筆者分析集成了上述所說的所有工具慈参,而且安裝配置更加傻瓜化呛牲。考慮到維護(hù)性驮配,筆者建議考慮配置 Haskell 環(huán)境的同學(xué)應(yīng)使用這個(gè)解決方案娘扩。

Haskell IDE Engine 與 Visual Studio Code 集成

從 Haskell IDE Engine 的介紹中可以看出,作者是按照“編輯器 + HIE”這種模式來設(shè)計(jì)的壮锻,故這次筆者嘗試了 Haskell IDE Engine + Visual Studio Code 的組合琐旁。選擇 Visual Studio Code 的原因主要是免費(fèi),畢竟筆者很窮躯保。
他們的集成也很簡單:
先從 VSCode 市場 安裝 Haskell Language Server ,然后再自行編譯 HIE旋膳。
可以根據(jù)自己所用的 GHC 版本選擇編譯 HIE , 但是根據(jù) 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
  • 一個(gè)流暢的網(wǎng)絡(luò)

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

現(xiàn)在就能使用 VSCode 愉快地?cái)]碼了怕篷。

后記

Haskell IDE Engine 還支持很多編輯器历筝,適應(yīng)性很廣。雖說現(xiàn)在用起來不如 HaskForce + IntelliJ IDEA 的組合廊谓,但是已發(fā)展的眼光來看梳猪,未來應(yīng)該是 Haskell IDE Engine 占主流地位的。所以筆者建議大家都可以試試蒸痹,總之目前用著還是比較滿意的春弥,以上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叠荠,一起剝皮案震驚了整個(gè)濱河市匿沛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌榛鼎,老刑警劉巖逃呼,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異借帘,居然都是意外死亡蜘渣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門肺然,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔫缸,“玉大人,你說我怎么就攤上這事际起∈奥担” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵街望,是天一觀的道長校翔。 經(jīng)常有香客問我,道長灾前,這世上最難降的妖魔是什么防症? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮哎甲,結(jié)果婚禮上蔫敲,老公的妹妹穿的比我還像新娘。我一直安慰自己炭玫,他們只是感情好奈嘿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吞加,像睡著了一般裙犹。 火紅的嫁衣襯著肌膚如雪尽狠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天叶圃,我揣著相機(jī)與錄音袄膏,去河邊找鬼。 笑死盗似,一個(gè)胖子當(dāng)著我的面吹牛哩陕,可吹牛的內(nèi)容都是我干的平项。 我是一名探鬼主播赫舒,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼闽瓢!你這毒婦竟也來了接癌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤扣讼,失蹤者是張志新(化名)和其女友劉穎缺猛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椭符,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荔燎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了销钝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片有咨。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蒸健,靈堂內(nèi)的尸體忽然破棺而出座享,到底是詐尸還是另有隱情,我是刑警寧澤似忧,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布渣叛,位于F島的核電站,受9級特大地震影響盯捌,放射性物質(zhì)發(fā)生泄漏淳衙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一饺著、第九天 我趴在偏房一處隱蔽的房頂上張望箫攀。 院中可真熱鬧,春花似錦瓶籽、人聲如沸匠童。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汤求。三九已至俏险,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扬绪,已是汗流浹背竖独。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挤牛,地道東北人莹痢。 一個(gè)月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像墓赴,于是被迫代替她去往敵國和親竞膳。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,796評論 25 707
  • 1.出現(xiàn)小r參數(shù)的命令 cp -rrm -rfls -r 2.出現(xiàn)R參數(shù)的命令 chown chmod 3.mv ...
    MySQL技術(shù)閱讀 201評論 0 0
  • 美妙的夜晚诫硕,咖啡冥想時(shí)間坦辟,很是喜悅,感恩所有的遇見章办,是時(shí)候給今天好種子澆水施肥锉走,我知道我正在運(yùn)用種子法則,我知道我...
    李鮮花閱讀 187評論 0 4