erlang中的类型vs不透明指令

erlang中的类型vs不透明指令,erlang,Erlang,-opaque和-type之间有什么区别?我在erlang核心模块中看到了这两个方面,但感觉不到区别。 是否可以同时使用-export\u type %% module1.erl -export_type([my_tup1/0, my_tup2/0]). -type my_tup1() :: {any(), any()}. -opaque my_tup2() :: {any(), any()}. %% module2.erl -spec foo1(module1:my_tup1()) ->

-opaque
-type
之间有什么区别?我在erlang核心模块中看到了这两个方面,但感觉不到区别。 是否可以同时使用
-export\u type

%% module1.erl
-export_type([my_tup1/0, my_tup2/0]).
-type my_tup1() :: {any(), any()}.
-opaque my_tup2() :: {any(), any()}.

%% module2.erl
-spec foo1(module1:my_tup1()) -> ok.
foo1({_, _}) -> ok. %% fine

-spec foo2(module1:my_tup2()) -> ok.
foo2({_, _}) -> ok. 
%% Dialyzer warning, because you are looking at 
%% the internal structure of a my_tup2() term.
%% If you defined the same function in the module module1, it wouldn't give a warning.

foo2(_) -> ok. %% no warning again.

是的,您可以同时导出这两种类型,如果不导出它们,则没有区别。

实际上,如果不导出类型,则将其声明为不透明是没有意义的。@aronisstav这正是我所说的:如果不导出,则它们是相同的。
-type
声明即使不导出也仍然有用。
-opaque
是完全没有意义的。@aronisstav No.未报告的
-opaque
仍然定义了一个可以在模块的规范中使用的类型。我以前考虑了更多的语义含义,但现在我想得更好了,即使这样,它也可能有一些用处。