medium翻译:在macOS的VS Code中开始Haskell

VS Code相较其它“企业级”IDE来说显得简洁,它支持所有操作系统。最重要的是,你可以将你所喜爱的语言和编辑器用VS Code轻易地集成在一起。

搜索扩展(extension),点击安装,一切就OK了。到目前为止,我在VS Code中毫无障碍地使用了JavaScript、Elm、Purescript、ReasonMl、F# 和 Python。语言类扩展普遍十分优秀,其中,F#的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命令会下载编译器到一个单独的位置,这样不会和系统中其它Haskell的启动器相冲突。现在可以启动VS Code了。

code .

注:VS Code内shift + command + p输入shell code以启动命令行设置

From Editor to IDE

当第一次打开stack配置的项目文件时,VS Code会呈现一种比较普通的文件模样。

无配置

让我们给它打扮一下!

syntax highlighting

第一个扩展是syntax highlighter,点击安装并重载后,平淡的文件看起来顺眼多了

syntax highlight

Linting Extension

继续美化代码,下一个安装的扩展是基于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 会增加一系列我们所期望的现代开发环境具有的特性,比如 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版本的编译器。切换目录,根据项目下载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需要安装测试环境。通过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

创建一个我们想测试结果的函数

test func

最终,通过实际的Spec 模块来测试函数输出

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

仅仅是安装环境和舒适的工具链便能造成学习一门新的编程语言的许多困难,还好VS Code这款熟悉的编辑器让我们把精力集中于语法和概念而非工具和工作流。

所以为什么要特地学习Haskell呢?

因为Haskell能使我们成为更好的编程者。Haskell提供解决问题的多种视角并且让强迫我们思考副作用的危害。这可能会让人望而却步,但是过一段时间,你会发现我们曾经依赖的mutations, hidden side effects, iteration才是可怕的。
Have fun!

文章翻译自medium

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容