1. 準(zhǔn)備環(huán)境
首先下載Haskell Platform先慷,它包含了GHC,Cabal蹄梢,還有其他的一些工具。
Mac OS X下載完后是一個pkg文件桨昙,例如检号,Haskell Platform 8.2.2 Full 64bit-signed.pkg
,
雙擊安裝即可蛙酪。
2. 新建工程
使用cabal
命令行工具,初始化工程翘盖,
$ mkdir my-tree-diff # 新建工程目錄
$ cd my-tree-diff # 進入目錄
$ cabal init # 初始化項目
然后就有一些提示桂塞,以填寫與工程相關(guān)的配置選項,
例如馍驯,package-name阁危,package version,license汰瘫,author name狂打,maintainer email,等等混弥。
一般使用默認(rèn)值即可趴乡,唯一需要手動輸入選項的是,
> What does the package build:
1) Library
2) Executable
Your choice? 2 # 這里我們選2,工程會生成一個可執(zhí)行文件
填寫完成后晾捏,cabal
會自動生成一些文件蒿涎,
my-tree-diff
├── ChangeLog.md
├── LICENSE
├── Main.hs
├── Setup.hs
└── my-tree-diff.cabal
3. 編譯 & 運行
直接在工程目錄下,執(zhí)行cabal run
惦辛,就會自動編譯并執(zhí)行劳秋,
$ cabal run
Resolving dependencies...
Configuring my-tree-diff-0.1.0.0...
Preprocessing executable 'my-tree-diff' for my-tree-diff-0.1.0.0..
Building executable 'my-tree-diff' for my-tree-diff-0.1.0.0..
[1 of 1] Compiling Main ( Main.hs, dist/build/my-tree-diff/my-tree-diff-tmp/Main.o )
Linking dist/build/my-tree-diff/my-tree-diff ...
Running my-tree-diff...
Hello, Haskell!
其中,Hello, Haskell!
是Main.hs
中輸入的結(jié)果胖齐,
module Main where
main :: IO ()
main = putStrLn "Hello, Haskell!"
注:
如果只編譯玻淑,可以執(zhí)行cabal build
,
$ cabal build
Preprocessing executable 'my-tree-diff' for my-tree-diff-0.1.0.0..
Building executable 'my-tree-diff' for my-tree-diff-0.1.0.0..
4. 工程依賴
使用cabal
創(chuàng)建的工程呀伙,依賴的Hackage包补履,需要在my-tree-diff.cabal
文件中配置,
在該文件中区匠,我們可以找到干像,build-depends: base >=4.10 && <4.11
,
它表示默認(rèn)依賴了base
包驰弄。
我們修改build-depends
字段的值麻汰,為之添加以下包,
他們是本例展示tree-diff使用方法所必須的戚篙,
build-depends:
base >=4.10 && <4.11,
tree-diff,
containers,
pretty
其中base
五鲫,tree-diff
,containers
岔擂,pretty
為Hackage中的包名位喂,
各依賴通過逗號來隔開,也可以省略版本號乱灵。
5. 修改Main.hs文件
module Main where
import Data.Tree -- 隸屬于containers包
import Text.PrettyPrint -- 隸屬于pretty包
import Data.TreeDiff -- 隸屬于tree-diff包
tree1 :: Tree Char
tree1 = Node 'a' [
return 'b',
Node 'c' [
return 'd',
return 'e'
],
return 'f'
]
tree2 :: Tree Char
tree2 = Node 'a' [
return 'b',
Node 'c' [
return 'd',
return 'e'
],
return 'g'
]
main :: IO ()
main = putStrLn $ render $ prettyEditExpr $ ediff tree1 tree2
其中塑崖,ediff,prettyEditExpr痛倚,render的類型如下规婆,
-- tree-diff包,Data.TreeDiff.Class模塊中
ediff :: ToExpr a => a -> a -> Edit EditExpr
-- tree包蝉稳,Data.TreeDiff.Pretty模塊中
prettyEditExpr :: Edit EditExpr -> Doc
-- pretty包抒蚜,Text.PrettyPrint模塊中
render :: Doc -> String
此外,return的類型如下耘戚,
-- containers包嗡髓,Data.Tree模塊中
return :: a -> Tree a
6. 執(zhí)行結(jié)果
$ cabal run
Preprocessing executable 'my-tree-diff' for my-tree-diff-0.1.0.0..
Building executable 'my-tree-diff' for my-tree-diff-0.1.0.0..
[1 of 1] Compiling Main ( Main.hs, dist/build/my-tree-diff/my-tree-diff-tmp/Main.o )
Linking dist/build/my-tree-diff/my-tree-diff ...
Running my-tree-diff...
Node
'a'
[Node 'b' [],
Node 'c' [Node 'd' [], Node 'e' []],
Node -'f' +'g' []]
參考
Haskell: Downloads
The Haskell Cabal
Hackage: tree-diff - Data.TreeDiff.Class - ediff
Hackage: tree-diff - Data.TreeDiff.Pretty - prettyEditExpr
Hackage: pretty - Text.PrettyPrint - render
Hackage: containers - Data.Tree - return