Dimitry Golubovsky wrote:
Does there exist a tool which given a Haskell source, shows functions
that are mutually recursive (i. e. call each other, even via calling
third, etc. functions)?
With pfe, the Programmatica tools command line interface, you can
currently get a list of definition level dependencies like this
(assuming your module is called Example):
% pfesetup +h Example.hs
% pfe deps Example
module DepExample:
declarator:
Text.ParserCombinators.Parsec.Prim.<?>
Text.ParserCombinators.Parsec.Prim.try
Hugs.Prelude.Monad Hugs.Prelude.>>= pointer idd
Text.ParserCombinators.Parsec.Prim.many cpi
Hugs.Prelude.return Declarator
Text.ParserCombinators.Parsec.Prim.inst__Text_ParserCombinators_Parsec_Prim_Monad__l_GenParser_tok_st_r_
idd:
Text.ParserCombinators.Parsec.Prim.<?>
Text.ParserCombinators.Parsec.Prim.<|>
Text.ParserCombinators.Parsec.Prim.try
Hugs.Prelude.Monad Hugs.Prelude.>>= anyIdString
Hugs.Prelude.return Hugs.Prelude.Either
Hugs.Prelude.Left Hugs.Prelude.>> tkOp declarator
Hugs.Prelude.Right
Text.ParserCombinators.Parsec.Prim.inst__Text_ParserCombinators_Parsec_Prim_Monad__l_GenParser_tok_st_r_
...
The dependency information is computed after type checking, so it
includes dependencies on instance declarations (which are assign names
starting with inst__).
I guess it would be usesful to also have an option to eliminate
dependencies on imported stuff, and an option to display mutually
recursive groups (strongly connected components of definitions).
Knowledge of that would help to split the
module into smaller modules without risk to create recursive modules.
The Programatica tools actually support mutually recursive modules, so
that wouldn't be a problem. We are still waiting for other Haskell
implementations to catch up :-)
--
Thomas H
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe