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

你可能感兴趣的:(medium翻译:在macOS的VS Code中开始Haskell)