简介

在用 Cabal 安装 Haskell 的软件时有时有碰到如下报错:

$ cabal new-install orgstat

Resolving dependencies...
cabal: Could not resolve dependencies:
[__0] trying: orgstat-0.1.6 (user goal)
[__1] next goal: base (dependency of orgstat)
[__1] rejecting: base-4.12.0.0/installed-4.1... (conflict: orgstat =>
base>=4.11 && <4.12)
[__1] rejecting: base-4.12.0.0, base-4.11.1.0, base-4.11.0.0, base-4.10.1.0,
base-4.10.0.0, base-4.9.1.0, base-4.9.0.0, base-4.8.2.0, base-4.8.1.0,
base-4.8.0.0, base-4.7.0.2, base-4.7.0.1, base-4.7.0.0, base-4.6.0.1,
base-4.6.0.0, base-4.5.1.0, base-4.5.0.0, base-4.4.1.0, base-4.4.0.0,
base-4.3.1.0, base-4.3.0.0, base-4.2.0.2, base-4.2.0.1, base-4.2.0.0,
base-4.1.0.0, base-4.0.0.0, base-3.0.3.2, base-3.0.3.1 (constraint from
non-upgradeable package requires installed instance)
[__1] fail (backjumping, conflict set: base, orgstat)
After searching the rest of the dependency tree exhaustively, these were the
goals I've had most trouble fulfilling: base, orgstat

可以看到 base 库的版本要求是 >=4.11 && <4.12 ,从 https://wiki.haskell.org/Base%5Fpackage 就能看到, 8.6.1 (August 2018) 开始的 GHC 就已经带的是 4.12.0.0base 包了。

所以我们需要用一个老版本的 GHC

Stack 和 Cabal

这两个都是 Haskell 界用于包管理的工具, Cabal 已经有些年头了, Stack 是新出的, 可以部分代替 Cabal 的工具。

Cabal

https://www.haskell.org/cabal/

Cabal 是官方出品的工具,一般我们用的是 cabal-installcabal 是他提供的命令行工具。 主要用于 Haskell 依赖库的管理和程序的分发。

  • 对于项目来说,Cabal 通过 .cabal 文件配置和管理项目的依赖。
  • 对于程序来说,Cabal 类似于 App Store,可以用 cabal install 来安装程序。

Stack

https://docs.haskellstack.org/en/stable/README/

Stack 是社区贡献的工具,主要用来:

  • 管理项目依赖,和 Cabal 一样
  • 管理 GHC,这个感觉很好用
  • 构建和测试项目

使用多个 GHC 版本

Stack 安装 GHC

Stack 可以用于安装多个版本的 GHC,安装后会放在 ~/.stack/programs/x86_64-osx/

通过命令安装 ghc-8.4.2

stack --resolver ghc-8.4.2 setup --reinstall

安装后可以看到:

$ ls ~/.stack/programs/x86_64-osx/ghc-8.4.2/
bin  lib  share

$ ls ~/.stack/programs/x86_64-osx/ghc-8.4.2/bin
ghc        ghc-pkg-8.4.2  haddock            hpc     runghc-8.4.2
ghc-8.4.2  ghci           haddock-ghc-8.4.2  hsc2hs  runhaskell
ghc-pkg    ghci-8.4.2     hp2ps              runghc

Cabal 使用指定版本 GHC

新版的 cabal install 能够指定使用的 GHC 二进制:

cabal new-install orgstat -w ~/.stack/programs/x86_64-osx/ghc-8.4.2/bin/ghc  --symlink-bindir=bin/

其中 -w ~/.stack/programs/x86_64-osx/ghc-8.4.2/bin/ghc 指定了使用上文安装的 ghc-8.4.2--symlink-bindir=bin/ 指定了安装后符号链接的位置,通过使用符号链接,把对应的二进制都放到这个文件夹里, 主要是方便加到 PATH 环境变量里。

symlink-bindir 也可以放到 cabal 的配置文件中。

后记

这个感觉是使用 Haskell 一个比较容易碰到的情况,但是搜了一下,感觉说的文章不多, 可能是国内用 Haskell 的人比较少,或者用的人都比较厉害。

Haskell 作为函数式编程的代表性语言,感觉还是很值得学习,也希望能有更多的中文文章, 让像我这样希望入门的人,能够更容易的上手。