medium翻譯:在macOS的VS Code中開始Haskell

VS Code相較其它“企業(yè)級”IDE來說顯得簡潔,它支持所有操作系統(tǒng)晴裹。最重要的是涧团,你可以將你所喜愛的語言和編輯器用VS Code輕易地集成在一起经磅。

搜索擴展(extension)预厌,點擊安裝轧叽,一切就OK了刊棕。到目前為止鞠绰,我在VS Code中毫無障礙地使用了JavaScript、Elm牺荠、Purescript休雌、ReasonMl肝断、F# 和 Python杈曲。語言類擴展普遍十分優(yōu)秀,其中胸懈,F(xiàn)#的Ionide插件令我印象深刻担扑。

一旦你能熟練地使用編輯器編寫你所擅長的語言,那么開始探索一門心儀已久的編程語言是件相當簡單的事趣钱。下面就讓我們開始吧涌献!

這篇教程的所有代碼可以在這里找到

language extension

The Haskell Tool Stack

Haskell VS Code extensions的操作說明并不會告訴你太多關于如何建立一個Haskell environment的信息。它會提及Cabal 和 GHCI兩個名詞首有,Haskell官方文檔關于Cabal和沙盒的說法也只會讓你一頭霧水悄谐。

幸運的是卵牍,Haskell Tool Stack是一個開始Haskell的簡單選擇。我們將通過homebrew來獲得它靴寂,請確保Xcode處于最新版本烙常,在終端輸入以下內容:

brew install haskell-stack

隨即開始一個新項目:

stack new my-project
cd my-project
stack setup

setup命令會下載編譯器到一個單獨的位置轴捎,這樣不會和系統(tǒng)中其它Haskell的啟動器相沖突。現(xiàn)在可以啟動VS Code了军掂。

code .

注:VS Code內shift + command + p輸入shell code以啟動命令行設置

From Editor to IDE

當?shù)谝淮未蜷_stack配置的項目文件時轮蜕,VS Code會呈現(xiàn)一種比較普通的文件模樣。

無配置

讓我們給它打扮一下蝗锥!

syntax highlighting

第一個擴展是syntax highlighter跃洛,點擊安裝并重載后,平淡的文件看起來順眼多了

syntax highlight

Linting Extension

繼續(xù)美化代碼终议,下一個安裝的擴展是基于hlint的代碼檢查工具linter汇竭,它能提供讓代碼更簡化和增加可讀性的建議

linter

安裝后你可能會看見以下錯誤:

error

好吧葱蝗,我們需要做一點配置工作讓linter extension生效

stack install hlint
..
Copying from /Users/{yourusername}/.stack/snapshots/x86_64-osx/lts-7.9/8.0.1/bin/hlint 
to /Users/{yourusername}/.local/bin/hlint

Stack會把hlint包拷貝到 ./local/bin目錄下,但是VS Code設置文件的hlint的路徑指向了hlint

hlint path

我們需要在~/.bash_profile中添加路徑 ~/.local/bin细燎,隨便用什么編輯器打開.bash_profile新增下列行

export PATH=$PATH:~/.local/bin

重啟VS Code两曼,瞧!它生效了玻驻。

linter suggestion

Language Server

Haskell Language Server 會增加一系列我們所期望的現(xiàn)代開發(fā)環(huán)境具有的特性悼凑,比如 type information, function definitions, jump to definition, case-splitting等等。

但是璧瞬,在安裝這個插件之前户辫,我們需要安裝與Stack初始化的項目版本相適應的 haskell-ide-engine。首先嗤锉,檢查一下項目文件使用了哪個版本的編譯器

stack ghc -- --version
The Glorious Glasgow Haskell Compilation System, version 8.6.4

Stack為我們配置了8.6.4版本的編譯器渔欢。切換目錄,根據(jù)項目下載haskell ide engine

cd ..
git clone https://github.com/haskell/haskell-ide-engine --recurse-submodules
cd haskell-ide-engine

需要對應version 8.6.4編譯器的haskell ide engine瘟忱。這看上去會花上一些時間奥额,至少在我的機器上是如此,所以在運行下列命令前泡好咖啡吧访诱。

stack ./install.hs hie-8.6.4
stack ./install.hs build-doc-8.6.4

最終我們可以安裝實際的插件了


Server

切換到我們的代碼文件垫挨,鼠標停留時,應該會看見下面關于IO monad 的信息盐数。炒雞開心棒拂!

server plug

Debugging Extension

最后一個要安裝的擴展為我們的Haskell項目提供debugging。所以趕緊回到目錄下安裝吧玫氢。


debug
cd ../my-project
stack install phoityne-vscode

Testing out the Debugger

為了測試debugging extension需要安裝測試環(huán)境帚屉。通過stack命令開始我們的test suit。

stack test
...
Test suite not yet implemented

By default our Spec.hs file simply prints to the console that we haven’t set anything up yet.
Let’s fix that using the advice from this article.
首先我們改動package.yaml漾峡,在依賴部分增加 hspec

test

然后用新依賴build一下

stack build

接下來攻旦,用下面的選項替換Spec.hs文件的所有東西,它會自動在test suite中尋找并運行所有spec文件

{-# OPTIONS_GHC -F -pgmF hspec-discover #-}

因為某些原因生逸,我在運行hspec-discover時報錯了牢屋。按照這個issue的建議解決了,然后安裝hspec-discover到全局

stack install hspec-discover

用下面的SpecHelper.hs 文件集中所有在test suite的依賴

SpecHelper

創(chuàng)建一個我們想測試結果的函數(shù)

test func

最終槽袄,通過實際的Spec 模塊來測試函數(shù)輸出

spec module

我們的項目樹如下烙无。記住,不同于F#遍尺,Haskell需要與模塊聲明對應的文件夾截酷。

directory tree

運行測試結果如下

testout

在spec file中得到 debugging信息,點擊VS Code的debug按鈕選擇haskell-debug-adapter乾戏,在MathSpec文件中增加斷點迂苛,按F5開始debugging三热。

SpecHelper

注意,這個項目的所有代碼在這里.

Now We’re Ready to Learn Haskell

僅僅是安裝環(huán)境和舒適的工具鏈便能造成學習一門新的編程語言的許多困難三幻,還好VS Code這款熟悉的編輯器讓我們把精力集中于語法和概念而非工具和工作流就漾。

所以為什么要特地學習Haskell呢?

因為Haskell能使我們成為更好的編程者念搬。Haskell提供解決問題的多種視角并且讓強迫我們思考副作用的危害抑堡。這可能會讓人望而卻步,但是過一段時間锁蠕,你會發(fā)現(xiàn)我們曾經依賴的mutations, hidden side effects, iteration才是可怕的夷野。
Have fun!

文章翻譯自medium

作者:Matthew Doig
原文地址:setting-up-haskell-in-vs-code-on-macos
可能遇到的問題:Installing HIE on Mac fails

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荣倾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骑丸,老刑警劉巖舌仍,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異通危,居然都是意外死亡铸豁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門菊碟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來节芥,“玉大人,你說我怎么就攤上這事逆害⊥纺鳎” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵魄幕,是天一觀的道長相艇。 經常有香客問我,道長纯陨,這世上最難降的妖魔是什么坛芽? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮翼抠,結果婚禮上咙轩,老公的妹妹穿的比我還像新娘。我一直安慰自己阴颖,他們只是感情好活喊,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著膘盖,像睡著了一般胧弛。 火紅的嫁衣襯著肌膚如雪尤误。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天结缚,我揣著相機與錄音损晤,去河邊找鬼。 笑死红竭,一個胖子當著我的面吹牛尤勋,可吹牛的內容都是我干的。 我是一名探鬼主播茵宪,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼最冰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稀火?” 一聲冷哼從身側響起暖哨,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凰狞,沒想到半個月后篇裁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡赡若,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年达布,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逾冬。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡黍聂,死狀恐怖,靈堂內的尸體忽然破棺而出身腻,到底是詐尸還是另有隱情产还,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布霸株,位于F島的核電站雕沉,受9級特大地震影響,放射性物質發(fā)生泄漏去件。R本人自食惡果不足惜坡椒,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尤溜。 院中可真熱鬧倔叼,春花似錦、人聲如沸宫莱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巡验,卻和暖如春际插,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背显设。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工框弛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捕捂。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓瑟枫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親指攒。 傳聞我的和親對象是個殘疾皇子慷妙,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容