为什么这个带有类型签名的erlang prog可以编译?

wan*_*kai 3 erlang elixir

我有这个程序:

-module(a).
-export([add/2]).
-export([add2/1]).

-spec add(integer(),integer())->integer().
add(A,B)->A+B.

add2(C)->C+add(1,"a").
Run Code Online (Sandbox Code Playgroud)

我可以毫无错误地编译这个程序。但我认为我应该得到该行的错误

add(1,"a").
Run Code Online (Sandbox Code Playgroud)

在任何静态类型语言中,它都无法编译,那么为什么erlang会编译这个?如何
编写类型签名以便erlang可以捕获这个错误?如果erlang不能,elixir可以编写相同的prog但可以捕获这个错误吗?谢谢!

Hau*_*eth 5

Erlang 不是静态类型语言,它始终是动态类型的。您在编译期间无法捕获它,因为根本erlc不关心。-spec它仅用于文档记录,Dialyzer(技术上是外部工具)可以使用它对合约进行一些(有限的)静态分析。

关于如何使用透析器请查看: