dialyzer and ets:select

Kostis Sagonas kostis@REDACTED
Wed Mar 22 14:48:39 CET 2006

Samuel Rivas wrote:
 > Seems that dialyzer makes a wrong typing for ets:select. I wrote a
 > little module to check it:
 > -module(ets_fail).
 > -export([foo/1]).
 > foo(Table) ->
 >    Tuples = ets:select(Table, [{{'_', '$1', '$2'}, [], ['$$']}]),
 >    [list_to_tuple(Tuple) || Tuple <- Tuples].

Thanks for the report.  I will refrain from commenting on the
choice of names for variables in your program -- this is not
what confused Dialyzer, but it surely confused me...

ets:select/2 is one of the BIFs implemented in C.  For these BIFs,
Dialyzer has hard-coded knowledge about its types, obtained mostly
by consulting the Erlang/OTP online implementation.  In this case,
it reads:

  select(Tab, MatchSpec) -> [Object]


      Tab = tid() | atom()
      Object = tuple()
      MatchSpec = match_spec()

Your example shows that the documentation is not correct.

Can somebody from the OTP team tell us the correct return type of
ets:select/2 ?


PS. (Unrelated)

    One more thing needs to be fixed in the OTP documentation. For
    the first argument should read starting from "0" rather than "1".

More information about the erlang-questions mailing list