[erlang-questions] edoc, erlc and dialyser type spec consistency

David Mercer <>
Fri Nov 20 20:31:22 CET 2009


Kostis Sagonas wrote:

> You managed to confuse me here... How can you have a "reusable" funtype?
> You cannot have functions with the same arguments in an Erlang module.
> Can you give us a concrete example of what you want to achieve and you
> cannot?

Let's say I am writing a parsing combinator library.  I define a parser as:

	-type parser(A) :: fun((state(A)) -> parse_result(A)).

The parameter is, say, the type of the tokens or something.  So a parser
that parses characters might have the following type:

	-type char_parser() :: parser(char()).

Now I have a combinator that given two parser()'s, creates a parser that
parses the first parser() followed by the second:

	-spec seq(parser(A), parser(A)) -> parser(A).

That's good, until I want to start defining parsers.  Every parser must
share the same specification, as laid out by parser():

	-spec parse_xml_tag(state(char())) -> parse_result(char()).
	-spec parse_edi_segment(state(char())) -> parse_result(char()).
	-spec parse_whitespace(state(char())) -> parse_result(char()).

And so on.  What I really want to say is that these functions are in
accordance with the type specification of parser(_) (or, in this case,
subtype char_parser()):

	-spec parse_xml_tag :: char_parser().
	-spec parse_edi_segment :: char_parser().
	-spec parse_whitespace :: char_parser().

That conveys my intent better, as a reader does not have to compare the
function specs to the parser() type to see if he can pass it to seq/2 or
not.

Did that make sense?

Cheers,

David



More information about the erlang-questions mailing list