Windows系统上使用cabal

需要用到Control.Monad.Cont模块, 结果提示没有安装. 这个模块属于mtl package. 需要用cabal安装. 但是ghc的bin目录里面根本没有cabal.exe.

根据文档cabal默认是包含在Haskell Platform里面的, 不知道为什么安装之后没有. 最后在这里找到了一个下载点:download cabal, 解压缩后重命名为cabal.exe, 然后放到Haskell bin目录里面.

首先运行 cabal list

 
cabal list > cabal.list
 

这回列出所有可用的package.

我们需要的package显示如下

 
* mtl
    Synopsis: Monad classes, using functional dependencies
    Default available version: 2.2.1
    Installed versions: [ Not installed ]
    Homepage: http://github.com/ekmett/mtl
    License:  BSD3
 

显示未安装. 执行

 
 
cabal install mtl
 
 

如果提示"the program ar is required" , 说明Haskell自带的mingw bin目录没有加到环境变量中. 执行

 
set path=%path%;C:\App\ghc\mingw\bin;
 

在ghci中运行如下Haskell 代码

 
-- example.hs
import Control.Monad.Cont
square :: Int -> Cont r Int
square x = return (x ^ 2)
 
--ghci
let a = square 4
*Main> :t a
a :: Cont r Int
 
*Main> let b = runCont a
*Main> :t b
b :: (Int -> r) -> r
 
*Main> b print
16
 

这是Continuation Monad最简单的一种形式, 现在square并不直接返回计算结果, 而是一个Continuation, 这个Continuation显式的指出square 计算的the rest of computation是print函数, 当然任何其他的函数也都是可以的, 即这个Continuation对象可以和其他的函数进行compose. 没有Continuation的情况下是这样的.

 
square:: Int -> Int
square x = x ^ 2
main = do
  let x = square 4
  print x