[erlang-questions] dialyzer output help
Jesper Louis Andersen
jesper.louis.andersen@REDACTED
Mon Aug 10 16:23:12 CEST 2015
On Mon, Aug 10, 2015 at 2:00 PM, Roelof Wobben <r.wobben@REDACTED> wrote:
> -spec(area() -> 'ok' | 'error').
(Sean is beating me to it by a few minutes, but I have some things in here
that pushes different perspectives on his answer, so I'll post it anyway)
This is not the precise way to specify a function. I think it may work
since the parens around the specification are ignored, but I wouldn't rely
on it. See
http://erlang.org/doc/reference_manual/typespec.html
and the section "Function specifications". The notation for the above would
be
-spec area() -> 'ok' | 'error'.
Anyway, on to the error. The problem is we have a spec for prompt_user/1
that looks like the following:
-spec prompt_user(string()) -> string().
But then you define:
number_from_user(Name) ->
Prompt = ["Enter ", Name, " > "],
to_positive_number(prompt_user(Prompt)).
Note how the type we call with is a list(string()). This clearly breaks the
contract in the code, since you said this can't occur in the -spec. At this
point, it is often clever to ask the `typer` tool what it believes the type
is, or you can change the code: either by altering the Prompt value in
number_from_user/1 (lists:append/1 might come in handy here), or by
switching the spec:
-spec prompt_user(Input) -> string()
when Input :: string() | [string()].
However, you may need to be more precise given that Unicode is in the game
here.
--
J.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150810/aa76d420/attachment.htm>
More information about the erlang-questions
mailing list