This is an example of how information is lost as a result of trunction of the
cost centre stack. The actual call graph is of this program is:
main -> f 1 -> g 2 -> f 3 -> h 1
But with pushing "f" a second time the "g" label is also lost. Additionally
the h-statement is associated with the stack [f], which can either be from the
untruncated f statement or the truncated f statement. We therefore infer the
following call graph:
main -> f 1 -> {f 3, g 2} -> h 1
\_________________^
> {-# LANGUAGE TemplateHaskell, Rank2Types #-}
> import Debug.Hoed.Stk
> $(observedTypes "f" [])
> $(observedTypes "g" [])
> $(observedTypes "h" [])
> f :: Int -> Int
> f x = $(observeTempl "f") f' x
> f' x = {-# SCC "f" #-} f'' x
> f'' 1 = g 2
> f'' x = h (x + 1)
> g :: Int -> Int
> g x = $(observeTempl "g") g' x
> g' x = {-# SCC "g" #-} g'' x
> g'' x = f (x + 1)
> h :: Int -> Int
> h x = $(observeTempl "h") h' x
> h' x = {-# SCC "h" #-} h'' x
> h'' x = (x+1)
> main = logO "hoed-tests-Stk-IndirectRecursion.graph" $ print (f 1)