如何在erlang中使用-spec功能

Mar*_*sen 6 erlang types casting

我正在写一个小的erlang服务,我想对我的类型设置约束.

我找到了-spec功能,在我看来这是一种将函数签名"锁定"到特定类型的方法.

我的例子是:

fib(N) when N < 3 ->
    1;
fib(N) ->
    fib(N-1) + fib(N-2).
Run Code Online (Sandbox Code Playgroud)

添加线

-spec fib_cps(pos_integer()) -> pos_integer().
Run Code Online (Sandbox Code Playgroud)

应该确保atleast方法返回正确的类型,但似乎并非如此.

如果我将功能更改为:

fib(N) when N < 3 ->
    ok;
fib(N) ->
    not_ok.
Run Code Online (Sandbox Code Playgroud)

代码仍然编译,很好,甚至运行.

我有什么误会?

wer*_*dle 11

编译器会跳过这些评论.但您可以使用透析器进行静态代码分析.此工具将警告您有关规范违规的信息.