为什么这个带有类型签名的erlang prog可以编译?
Why this erlang prog with type signature can compile?
我有这个程序:
-module(a).
-export([add/2]).
-export([add2/1]).
-spec add(integer(),integer())->integer().
add(A,B)->A+B.
add2(C)->C+add(1,"a").
我可以编译这个 prog 没有 error.but 我想我应该得到错误行
add(1,"a").
在任何静态类型语言中,它都无法编译,为什么erlang会编译这个?如何
编写类型签名以便 erlang 可以捕获此错误?如果 erlang 不能,elixir 可以编写相同的程序但可以捕获此错误吗?谢谢!
Erlang 不是静态类型语言,它总是动态类型。您无法在编译期间捕获它,因为 erlc
根本不关心 -spec
。它仅用于文档,Dialyzer(从技术上讲是外部工具)可以使用它对合约进行一些(有限的)静态分析。
关于如何使用 Dialyzer 查看:
Erlang 编译器不检查类型规范。您可以使用 Erlang 中包含的 Dialyzer 来检查它们:
dialyzer --src a.erl
它给出以下输出:
Proceeding with analysis...
a.erl:8: Function add2/1 has no local return
a.erl:8: The call a:add
(1,
"a") will never return since the success typing is
(number(),
number()) ->
number() and the contract is
(integer(), integer()) -> integer()
done in 0m0.19s
done (warnings were emitted)
第一次 运行 Dialyzer 时,它会抱怨它没有标准应用程序的 PLT(持久查找 Table)。您可以使用以下方法构建它:
dialyzer --build_plt --apps erts kernel stdlib mnesia
我有这个程序:
-module(a).
-export([add/2]).
-export([add2/1]).
-spec add(integer(),integer())->integer().
add(A,B)->A+B.
add2(C)->C+add(1,"a").
我可以编译这个 prog 没有 error.but 我想我应该得到错误行
add(1,"a").
在任何静态类型语言中,它都无法编译,为什么erlang会编译这个?如何
编写类型签名以便 erlang 可以捕获此错误?如果 erlang 不能,elixir 可以编写相同的程序但可以捕获此错误吗?谢谢!
Erlang 不是静态类型语言,它总是动态类型。您无法在编译期间捕获它,因为 erlc
根本不关心 -spec
。它仅用于文档,Dialyzer(从技术上讲是外部工具)可以使用它对合约进行一些(有限的)静态分析。
关于如何使用 Dialyzer 查看:
Erlang 编译器不检查类型规范。您可以使用 Erlang 中包含的 Dialyzer 来检查它们:
dialyzer --src a.erl
它给出以下输出:
Proceeding with analysis...
a.erl:8: Function add2/1 has no local return
a.erl:8: The call a:add
(1,
"a") will never return since the success typing is
(number(),
number()) ->
number() and the contract is
(integer(), integer()) -> integer()
done in 0m0.19s
done (warnings were emitted)
第一次 运行 Dialyzer 时,它会抱怨它没有标准应用程序的 PLT(持久查找 Table)。您可以使用以下方法构建它:
dialyzer --build_plt --apps erts kernel stdlib mnesia