Data.Graphを試そう

30分プログラム、その710。Haskellでグラフを扱いたかったので、Data.Graphを試してみました。

mkGraphの返すグラフの型が、具体的な型ではなく、grになっています。

*Main> :t mkGraph
mkGraph :: (Graph gr) => [LNode a] -> [LEdge b] -> gr a b

これはこれで便利なんでしょうが、今回は面倒なのでGrに束縛しています。

*main> :i Gr
data Gr a b
  = ....
...
instance [overlap ok] Graph Gr
  -- Defined in Data.Graph.Inductive.Tree
...

ソースコード

import Data.Graph.Inductive.Query.BFS
import Data.Graph.Inductive.Graph
import Data.Graph.Inductive.Tree

-- ノードとエッジの準備
ns = zip [1..] ["A","B","C","D","E"]
es = [(1,2,"A->B"), (1,3,"A->C"), (3,4,"C->D"), (1,4,"A->D"),(4,5,"D->E")]

-- 型を与えてやらないとダメ
graph :: Gr String String
graph = mkGraph ns es

-- [(1,"A->D"),(4,"A->D"),(5,"D->E")]になる
shortPath = lesp 1 5 graph