使用 Haskell 碰到 GHC 版本的问题,但是搜了一下,感觉说的文章不多, 可能是国内用 Haskell 的人比较少,或者用的人都比较厉害。
Haskell 作为函数式编程的代表性语言,感觉还是很值得学习,也希望能有更多的中文文章, 让像我这样希望入门的人,能够更容易的上手。
简介
在用 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.0
的 base
包了。
所以我们需要用一个老版本的 GHC
。
Stack 和 Cabal
这两个都是 Haskell 界用于包管理的工具, Cabal 已经有些年头了, Stack 是新出的, 可以部分代替 Cabal 的工具。
Cabal
https://www.haskell.org/cabal/
Cabal 是官方出品的工具,一般我们用的是 cabal-install
, cabal
是他提供的命令行工具。
主要用于 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 的配置文件中。