<div dir="ltr">Thanks <span style="font-size:14px;white-space:nowrap">Magnus,</span><div><span style="font-size:14px;white-space:nowrap"><br></span></div><div><span style="font-size:14px;white-space:nowrap">I found that If I construct a map in the erl file,  the dialyzer will find an type error.</span></div><div><br></div><div><br></div><div><div><pre style="color:rgb(169,183,198);font-family:"fira mono";font-size:12pt;background-color:rgb(43,43,43)">-module(xx)<span style="color:rgb(204,120,50);font-weight:bold">.<br></span><span style="color:rgb(204,120,50);font-weight:bold"><br></span>-export([find_value/<span style="color:rgb(104,151,187)">2</span>])<span style="color:rgb(204,120,50);font-weight:bold">.<br></span><span style="color:rgb(204,120,50);font-weight:bold"><br></span>-type my_type() :: #{integer() := string()}<span style="color:rgb(204,120,50);font-weight:bold">.<br></span><span style="color:rgb(204,120,50);font-weight:bold"><br></span>find_value(<span style="color:rgb(152,118,170)">Key</span>, <span style="color:rgb(152,118,170)">_State</span>) <span style="color:rgb(204,120,50);font-weight:bold">when </span>is_atom(<span style="color:rgb(152,118,170)">Key</span>) -><br>    <span style="color:rgb(152,118,170)">State </span>= #{<span style="color:rgb(104,151,187)">1 </span>=> <span style="color:rgb(106,135,89)">"abc"</span>, <span style="color:rgb(104,151,187)">2 </span>=> <span style="color:rgb(106,135,89)">"def"</span>},<br>    find_value_1(<span style="color:rgb(152,118,170)">Key</span>, <span style="color:rgb(152,118,170)">State</span>)<span style="color:rgb(204,120,50);font-weight:bold">.<br></span><span style="color:rgb(204,120,50);font-weight:bold"><br></span>-spec find_value_1(atom(), my_type()) -> string()<span style="color:rgb(204,120,50);font-weight:bold">.<br></span>find_value_1(<span style="color:rgb(152,118,170)">Key</span>, <span style="color:rgb(152,118,170)">State</span>) -><br>    #{<span style="color:rgb(152,118,170)">Key </span>:= <span style="color:rgb(152,118,170)">Value</span>} = <span style="color:rgb(152,118,170)">State</span>,<br>    <span style="color:rgb(152,118,170)">Value</span><span style="color:rgb(204,120,50);font-weight:bold">.<br></span><span style="color:rgb(204,120,50);font-weight:bold"><br></span></pre></div></div><div><br></div><div><span style="font-size:14px;white-space:nowrap"><br></span></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span style="font-size:14px;white-space:nowrap">  Checking whether the PLT /home/wang/.dialyzer_plt is up-to-date... yes</span></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span style="font-size:14px;white-space:nowrap">  Proceeding with analysis...</span></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span style="font-size:14px;white-space:nowrap">xx.erl:14: Function find_value/2 has no local return</span></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span style="font-size:14px;white-space:nowrap">xx.erl:19: Function find_value_1/2 has no local return</span></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span style="font-size:14px;white-space:nowrap">xx.erl:20: The pattern #{Key:=Value} can never match the type #{1:=[97 | 98 | 99,...], 2:=[100 | 101 | 102,...]}</span></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span style="font-size:14px;white-space:nowrap"> done in 0m1.42s</span></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span style="font-size:14px;white-space:nowrap">done (warnings were emitted)</span></blockquote><div style="font-size:14px;white-space:nowrap"><br></div></blockquote><div><br></div><div><br></div><div>But , if the map is not constructed in this erl file,  dialyzer can not find any error.</div><div><br></div><div><br></div><div><pre style="color:rgb(169,183,198);font-family:"fira mono";font-size:12pt;background-color:rgb(43,43,43)"><br>-module(xx)<span style="color:rgb(204,120,50);font-weight:bold">.<br></span><span style="color:rgb(204,120,50);font-weight:bold"><br></span>-export([find_value/<span style="color:rgb(104,151,187)">2</span>])<span style="color:rgb(204,120,50);font-weight:bold">.<br></span><span style="color:rgb(204,120,50);font-weight:bold"><br></span>-type <span style="background-color:rgb(52,65,52)">my_type</span>() :: #{integer() := string()}<span style="color:rgb(204,120,50);font-weight:bold">.<br></span><span style="color:rgb(204,120,50);font-weight:bold"><br></span>-spec find_value(atom(), <span style="background-color:rgb(52,65,52)">my_type</span>()) -> string()<span style="color:rgb(204,120,50);font-weight:bold">.<br></span>find_value(<span style="color:rgb(152,118,170)">Key</span>, <span style="color:rgb(152,118,170)">State</span>) <span style="color:rgb(204,120,50);font-weight:bold">when </span>is_atom(<span style="color:rgb(152,118,170)">Key</span>) -><br>    find_value_1(<span style="color:rgb(152,118,170)">Key</span>, <span style="color:rgb(152,118,170)">State</span>)<span style="color:rgb(204,120,50);font-weight:bold">.<br></span><span style="color:rgb(204,120,50);font-weight:bold"><br></span>-spec find_value_1(atom(), <span style="background-color:rgb(52,65,52)">my_type</span>()) -> string()<span style="color:rgb(204,120,50);font-weight:bold">.<br></span>find_value_1(<span style="color:rgb(152,118,170)">Key</span>, <span style="color:rgb(152,118,170)">State</span>) -><br>    #{<span style="color:rgb(152,118,170)">Key </span>:= <span style="color:rgb(152,118,170)">Value</span>} = <span style="color:rgb(152,118,170)">State</span>,<br>    <span style="color:rgb(152,118,170)">Value</span><span style="color:rgb(204,120,50);font-weight:bold">.<br></span><span style="color:rgb(204,120,50);font-weight:bold"><br></span></pre></div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">  Checking whether the PLT /home/wang/.dialyzer_plt is up-to-date... yes</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">  Proceeding with analysis... done in 0m1.35s</blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">done (passed successfully)</blockquote><div><br></div></blockquote><div><br></div><div> </div><div> </div><div><span style="font-size:14px;white-space:nowrap"><br></span></div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-09-23 7:01 GMT+08:00 Magnus Lång <span dir="ltr"><<a href="mailto:margnus1@gmail.com" target="_blank">margnus1@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div text="#000000" bgcolor="#FFFFFF"><span class="">
    <div>On 2016-09-22 18:39, 月忧茗 wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">
        <div>According this document: <a href="http://erlang.org/doc/reference_manual/typespec.html" target="_blank">http://erlang.org/<wbr>doc/reference_manual/typespec.<wbr>html</a></div>
        <div><br>
        </div>
        <div>I can define a map type like this:</div>
        <div><br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">-type
          my_type() ::  #{integer() := string()}.</blockquote>
        <div><br>
        </div>
        <div>I have a map called State, it's type is `my_type`,   key
          type is integer, value type is string.</div>
        <div><br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">-spec
          find_value(atom(), my_type()) -> string().<br>
          find_value(Key, State) when is_atom(Key) -><br>
              #{Key := Value} = State,<br>
              Value.</blockquote>
        <div><br>
        </div>
        <div><br>
        </div>
        <div>Using dialyzer analysis the file.   nothing happens.</div>
        <div>dialyzer say there is no error for this file.</div>
        <div><br>
        </div>
        <div>I know maps are dynamic,  my_type() just meas this map must
          have a integer key associated with a string value.</div>
        <div>But not limit to add other type key and value in the map.</div>
        <div><br>
        </div>
        <div>My question is that Is it possible limit the map types of
          key and value ?</div>
        <div>So dialyzer can find the match error in my program.</div>
      </div>
    </blockquote>
    <br></span>
    Actually, your type is already restricted in this way, and I'm
    surprised your <tt>find_value</tt> example does not produce any
    warnings. Dialyzer should be quite capable of finding the problem.
    Indeed, if we enforce the type of the State argument in this
    (slightly ridiculous) way instead of using a type specification, the
    problem <i>is</i> found:<br>
    <pre>find_value(Key, State) ->
    StateList = [{K, V} || {K, V} <- maps:to_list(State),
                           is_integer(K), is_list(V)],
    find_value_1(Key, maps:from_list(StateList)).

find_value_1(Key, State) when is_atom(Key) ->
    #{Key := Value} = State,
    Value.
</pre>
    When I get some time over, I'll have a look at why your example does
    not fail, but for now rest assured that your type syntax is correct
    and means what you want it to mean.<span class="HOEnZb"><font color="#888888"><br>
    <br>
    // Magnus<br>
  </font></span></div>

<br>______________________________<wbr>_________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/<wbr>listinfo/erlang-questions</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">My GitHub<br><a href="https://github.com/yueyoum" target="_blank">https://github.com/yueyoum</a><br><br></div></div>
</div>