[erlang-questions] Trouble with init/1 spec
Kostis Sagonas
kostis@REDACTED
Wed Mar 24 17:00:52 CET 2010
Jay Nelson wrote:
> I am having trouble specifying an init/1 function. This should be a
> problem for most gen_xxx applications that use records for State, so I
> must have not used the right query terms to search the archives.
>
> Here is my init/1 function for a gen_fsm:
>
> -spec init(list()) -> {ok, ?RECONNECT, #twfsm_state{}}.
>
> init([Server, Port, User, Pwd]) ->
> {ok, ?RECONNECT,
> #twfsm_state{server=Server, port=Port, user=User, pwd=Pwd}}.
>
>
> The problem is that I cannot figure out how to specify that I really am
> passing in a list of the type [string(), non_neg_integer(), string(),
> string()].
You cannot do that. The type language is not expressive enough to allow
the declaration of a 4-element list and this is what's the problem here.
However, you can specify a slightly more accurate type than list()
though (btw, this is also written as [_].) The type
[string() | non_neg_integer()]
constrains the input argument better than list()
> Declaring it as list(any()) means the fields on the record
> have to all be declared any(). As long as my port field is declared
> non_neg_integer() in the record definition, I can't get past the
> dialyzer warning.
Huh? Are you sure? The record fields can be declared whatever type you
want. I am not sure to what dialyzer warning you are referring to, but
perhaps we can take this off list.
> On a separate note non_neg_integer() is equivalent to 0..
> Can the user declare something like my_lucky_numbers() = 12..17 or is
> the integer .. notation just used to explain what happens internally for
> the special built-in types?
Well, sort of. The .. notation can be used to define your lucky numbers,
but it can only be used if you specify both a lower and an upper limit.
In other words, this is allowed:
-type my_lucky_number() :: 12..17.
but this one is not:
-type my_lucky_number() :: 12.. .
Kostis
More information about the erlang-questions
mailing list