免梯子安装 hasekll 开发环境(2023版)

haskell 工具链

所谓工欲善其事,必先利其器。在我们学习 haskell 之前完成一整开发环境的安装也是非常重要的。配置 haskell 开发环境会涉及到很多的工具链,新手看了往往会一脸懵。因此这里先对各种工具链进行一个简单的介绍:

  • ghc(Glasgow Haskell Compiler): haskell 基础编译器,用于将 haskell 代码编译为可执行文件。
  • cabal: 用于构建/打包依赖管理等,类似于 java 中的 maven
  • stack: 一"栈"式项目管理工具。stack 是相对于 cabal 更上层也更新的一个构建工具,它是基于 cabal 的。目前更推荐使用 stack 来管理项目
  • hsl(Haskell Language Server): LSP 的 haskell 实现。我们需要 hsl 来实现 haskell 的代码高亮,错误提示等
  • hsl-vscode 插件: 结合 hsl 在 vscode 中实现 haskell 的代码高亮,错误提示等
  • ghcup: 一个便捷的安装程序,可以安装/管理/切换上面提到的所有工具链

在之前我都是通过梯子进行一把梭的安装。但是为了考虑到有的同学并没有方便的梯子,我进行了一些探索,以便于方便大家在没有梯子的情况下能搭建 haskell 的开发环境。

Step 1. 安装工具

既然 ghcup 可以安装所有的工具链,那么第一步就是先安装 ghcup(安装的过程中也会安装其他工具链)。为了避免网络问题导致的失败,我们先进行一点准备工作:

  1. 安装以下编译工具 build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5 在 debain 系可以通过 sudo apt install build-essential curl libffi-dev libffi8ubuntu1 libgmp-dev libgmp10 libncurses-dev libncurses5 libtinfo5 来安装。其他发行版使用发行版对应的包管理工具安装即可。
  2. 创建 cabal 配置文件 ~/.cabal/config 填入以下内容:
yaml 复制代码
repository mirrors.ustc.edu.cn
  url: https://mirrors.ustc.edu.cn/hackage/
  secure: True
  1. 访问 https://mirrors.ustc.edu.cn/ghcup/ghcup-metadata/ 获取 ghcup 目前配置文件最新版本版本,例如本文在编写时最新版为 0.0.8:

  2. 创建 ghcup 配置文件 ~/.ghcup/config.yaml填入以下内容:

ruby 复制代码
url-source:
    OwnSource: https://mirrors.ustc.edu.cn/ghcup/ghcup-metadata/ghcup-{version}.yaml

请把 {version} 替换为第一步中的版本号。

  1. 使用以下命令进行安装:
sh 复制代码
# linux & macos 用户
curl --proto '=https' --tlsv1.2 -sSf https://mirrors.ustc.edu.cn/ghcup/sh/bootstrap-haskell | BOOTSTRAP_HASKELL_YAML=https://mirrors.ustc.edu.cn/ghcup/ghcup-metadata/ghcup-{version}.yaml sh


# Windows 用户:以非管理员身份在 PowerShell 中运行如下命令
$env:BOOTSTRAP_HASKELL_YAML = 'https://mirrors.ustc.edu.cn/ghcup/ghcup-metadata/ghcup-{version}.yaml'
Set-ExecutionPolicy Bypass -Scope Process -Force;[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;Invoke-Command -ScriptBlock ([ScriptBlock]::Create((Invoke-WebRequest https://mirrors.ustc.edu.cn/ghcup/sh/bootstrap-haskell.ps1 -UseBasicParsing))) -ArgumentList $true

请把 {version} 替换为第一步中的版本号。执行命令后,会有命令行提示需要确认,按以下进行输入即可:

最后出现以下内容即表示安装成功。

ghcup 有一个非常好用的功能 ghcup tui 可以通过命令行的方式来展示/安装/切换各种工具链(需要重启命令行 ghcup 命令才能够识别),画面如下:

前面有两个√则表示工具已被安装并且已设为默认,如果只有一个√则表示工具已被安装但并未设置为默认。使用方向键移动光标选择某个工具链的版本后按不同的按键有不同的功能(注意输入法不能在中文模式):

  • i: 安装该版本
  • u: 卸载该版本
  • s: 设置该版本为默认版本

Step2. 创建项目

  1. 修改 ~/.stack/config.yaml 增加以下配置:
yaml 复制代码
setup-info-locations:
   - http://mirrors.ustc.edu.cn/stackage/stack-setup.yaml
urls:
  latest-snapshot: http://mirrors.ustc.edu.cn/stackage/snapshots.json
snapshot-location-base: http://mirrors.ustc.edu.cn/stackage/stackage-snapshots/
  1. 下载 global-hints~/.stack/pantry/global-hints-cache.yaml (在 Windows 下是 %APPDATA%\stack\pantry\global-hints-cache.yaml
  2. 执行命令 stack config set system-ghc --global true 这一步是为了配置 stack 不自动安装 ghc 而使用我们已经安装好的版本。不然可能会因为网络问题导致安装失败。
  3. 使用 stack new hello-hsk 创建一个新项目
  4. 使用 ghc --version 查看 ghc 的版本,并在 https://www.stackage.org/ 中查找对应的 lts 版本。例如目前我安装的 ghc 版本是 9.4.8 则对应的 lts 版本为 lts-21.25:

6. cd hello-hsk 进入项目,修改stack.yaml,将 resolver 修改为步骤 5 中的 lts 版本。例如:

yaml 复制代码
# 修改前
resolver:
  url: http://mirrors.ustc.edu.cn/stackage/stackage-snapshots/lts/22/7.yaml

# 修改后
resolve: lts-21.25
  1. stack run 编译并运行项目。

其中步骤 1-3 只需要在第一次初始化时执行,后续新建项目时就不用再执行这几个步骤了。至此我们的第一个 haskell 项目就建立成功了。理论上我们已经可以开始开发。但是为了方便起见,我们还需要继续设置 vscode 中的 haskell 代码高亮。

Step3. Vscode 继承 HSL

虽然大佬都可以用记事本写代码,但是我还是建议采用 Vscode + hsl 的方式来获取更好的代码体验。 首先安装 hsl vscode 插件,在插件市场搜索 haskell 排名第一的就是:

理论上安装完成就应该自动生效了,写一个明显错误的语法,如果给出了红色的下划线提示就表明生效了。

如果并没有生效那么我们可能需要进行以下的步骤:

  1. 手动设置 hsl 的地址: 打开 vscode 的 设置,搜索 server executable path 并将其设置为 ~/.ghcup/bin/haskell-language-server-wrapper

2. Ctrl+Shift+p 调出命令模式,执行 restart haskell LSP server 并执行

如果还未成功,则需要验证安装的 ghchsl 是否版本匹配。使用 ghc --version 以及 haskell-language-server-wrapper --version 分别获取 ghc 以及 hsl 的 版本。访问 https://haskell-language-server.readthedocs.io/en/latest/support/ghc-version-support.html# 查看版本是否匹配,如果不匹配,则使用 ghcup 来安装并切换到正确的版本。

总结

终于,经历了这么多我们终于完成了 haskell 工具链的安装。完成了万里长征第一步,后续还有更多的挑战等着我们。欢迎大家在评论区分享安装遇到的问题以及解决方案。

相关推荐
再思即可1 个月前
sicp每日一题[2.77]
算法·lisp·函数式编程·sicp·scheme
桦说编程1 个月前
把 CompletableFuture 当做 monad 使用的潜在问题与改进
后端·设计模式·函数式编程
蜗牛快跑2131 个月前
面向对象编程 vs 函数式编程
前端·函数式编程·面向对象编程
大福是小强2 个月前
002-Kotlin界面开发之Kotlin旋风之旅
kotlin·函数式编程·lambda·语法·运算符重载·扩展函数
再思即可2 个月前
sicp每日一题[2.63-2.64]
算法·lisp·函数式编程·sicp·scheme
老章学编程i2 个月前
Java函数式编程
java·开发语言·函数式编程·1024程序员节·lanmbda
安冬的码畜日常2 个月前
【玩转 JS 函数式编程_014】4.1 JavaScript 纯函数的相关概念(下):纯函数的优势
开发语言·javascript·ecmascript·函数式编程·js·functional·原生js
Dylanioucn2 个月前
【编程进阶知识】Java 8 函数式编程接口全解析:Supplier、Runnable、Function、Consumer、Apply
java·开发语言·函数式编程
矢心3 个月前
函数式编程---js的链式调用理解与实现方法
前端·javascript·函数式编程
安冬的码畜日常3 个月前
【玩转 JS 函数式编程_006】2.2 小试牛刀:用函数式编程(FP)实现事件只触发一次
开发语言·前端·javascript·函数式编程·tdd·fp·jasmine