调用从Haskell中的cabal构建的库中的函数

时间:2015-03-03 00:52:02

标签: haskell cabal

从书籍Beginning Haskell,我了解到我可以从cabal安装文件(chapter2.cabal)构建一个包。来源可从http://www.apress.com/downloadable/download/sample/sample_id/1516/

下载

例如,这是第2节示例中的Cabal文件的示例。

name:           chapter2
version:        0.1
cabal-version:  >=1.2
build-type:     Simple
author:         Alejandro Serrano

library
  hs-source-dirs:  src
  build-depends:   base >= 4
  ghc-options:     -Wall
  exposed-modules: 
                   Chapter2.Section2.Example,
                   Chapter2.SimpleFunctions
  other-modules:   
                   Chapter2.DataTypes,
                   Chapter2.DefaultValues

cabal build之后,我可以编译动态和静态库。

.
├── Setup.hs
├── chapter2.cabal
├── dist
│   ├── build
│   │   ├── Chapter2
...
│   │   ├── autogen
│   │   │   ├── Paths_chapter2.hs
│   │   │   └── cabal_macros.h
│   │   ├── libHSchapter2-0.1-ghc7.8.3.dylib <-- dynamic lib
│   │   └── libHSchapter2-0.1.a <-- static lib
│   ├── package.conf.inplace
│   └── setup-config
└── src
    └── Chapter2
        ├── DataTypes.hs
        ├── DefaultValues.hs
        ├── Section2
        │   └── Example.hs
        └── SimpleFunctions.hs

然后,我如何使用其他Haskell代码中的库函数(在ghc和ghci中)?例如,src / Chapter2 / SimpleFunctions.hs有maxim函数,如何调用以Haskell库形式编译的函数?

maxmin list = let h = head list
              in if null (tail list)
                 then (h, h)
                 else ( if h > t_max then h else t_max
                      , if h < t_min then h else t_min )
                      where t = maxmin (tail list)
                            t_max = fst t
                            t_min = snd t 

2 个答案:

答案 0 :(得分:1)

要使用ghci中的maxmin,只需加载源文件:

chapter2$ ghci
> :l src/Chapter2/SimpleFunctions
> maxmin [1,2,3]
(3,1)

在说出如何使用ghc&#39;中的maxmin功能时,我不确定您的意思。我想你的意思是&#39;如何在我的节目中使用maxmin&#39; (可以用ghc编译)。如果您查看src/Chapter2/SimpleFunctions.hs的第一行,您可以在名为Chapter2.SimpleFunctions的模块中看到它。因此,在您自己的程序/代码中,您需要导入该模块才能使用maxmin。作为一个例子:

chapter2$ cat Test.hs

-- In your favorite editor write down this file.
import Chapter2.SimpleFunctions

main = print $ maxmin [1,2,3]

chapter2$ ghc Test.hs -i.:src/
chapter2$ ./Test
(3,1)

ghc Test.hs -i.:src/正在寻找ghc来查找当前和src/目录中的文件。

答案 1 :(得分:0)

使用cabal install配置系统以使用刚刚创建的库。该库安装在~/.cabal/lib

enter image description here

对于ghci的使用,您可以导入库。

Prelude> import Chapter2.SimpleFunctions
Prelude Chapter2.SimpleFunctions> maxmin [1,2]
(2,1)

对于ghc的用法,您还可以导入库,以便编译器自动进行链接。

import Chapter2.SimpleFunctions

main :: IO ()
main = putStrLn $ show $ maxmin [1,2,3]

编译并运行:

chapter2> ghc ex.hs 
[1 of 1] Compiling Main             ( ex.hs, ex.o )
Linking ex ...
chapter2> ./ex
(3,1)