1 --!!! trying to have a polymorphic type sig where inappropriate
5 data MaybeErr val err = Succeeded val | Failed err deriving ()
7 type Edge vertex = (vertex, vertex)
8 type Cycle vertex = [vertex]
10 stronglyConnComp :: Eq vertex => [Edge vertex] -> [vertex] -> [[vertex]]
12 stronglyConnComp es vs
13 = snd (span_tree (new_range reversed_edges)
15 ( snd (dfs (new_range es) ([],[]) vs) )
18 -- *********** the offending type signature **************
19 reversed_edges :: Eq v => [Edge v]
20 reversed_edges = map swap es
22 -- WRONGOLA: swap :: Eq v => Edge v -> Edge v
25 -- WRONGOLA?: new_range :: Eq v => [Edge v] -> v -> [v]
28 new_range ((x,y):xys) w
30 then (y : (new_range xys w))
31 else (new_range xys w)
34 span_tree :: Eq v => (v -> [v])
40 span_tree r (vs,ns) [] = (vs,ns)
41 span_tree r (vs,ns) (x:xs)
42 | x `elem` vs = span_tree r (vs,ns) xs
43 | otherwise = span_tree r (vs',(x:ns'):ns) xs
45 (vs',ns') = dfs r (x:vs,[]) (r x)
47 dfs :: Eq v => (v -> [v])
52 dfs r (vs,ns) [] = (vs,ns)
53 dfs r (vs,ns) (x:xs) | x `elem` vs = dfs r (vs,ns) xs
54 | otherwise = dfs r (vs',(x:ns')++ns) xs
56 (vs',ns') = dfs r (x:vs,[]) (r x)