使用typer的意外结果

Pas*_*cal 2 erlang types

我决定在我的一些代码中添加类型定义,然后我运行Typer来获得一个起点(erlang 15b02,typer 0.9.4).

我选择了一些结果来检查是否一切都很好,发现这个结果我不明白:

par(true, o) -> "(";
par(true, f) -> ")";
par(_, _) -> "".
Run Code Online (Sandbox Code Playgroud)

产生规格:

-spec par(boolean(),'f' | 'o') -> [40 | 41].
Run Code Online (Sandbox Code Playgroud)

我可以理解输入参数,因为这个函数没有被导出,我的代码只用一个布尔表达式作为第一个参数调用函数,而原子o或f作为第二个参数调用(例如par(4 > P, o)).

但为什么返回列表不包含空列表?我期待的东西像[40 | 41 | []][40 | 41 | ""]

此代码用于打印数学表达式,并在优先级或运算符足够时避免括号; 例如打印

3 + 4 + 5 * (6 + 7) - sin( x + 7) 而不是

3 + ( 4 + (( 5 * ( 6 + 7 )) - sin(( x + 7)))).

我确信使用false作为第一个参数调用代码,如测试覆盖率的结果所示:

    15..|  par(true, o) -> "(";
    15..|  par(true, f) -> ")";
   308..|  par(_, _) -> "".
Run Code Online (Sandbox Code Playgroud)

leg*_*cia 5

作为Erlang类型规范,[X]表示"零个或多个类型元素的列表X".在你的情况,X40 | 41,所以"(",")","()()"""所有符合这种类型.没有办法将一个元素的列表表达为类型规范.

可以将包含至少一个元素的列表指定为[X,...].typer说的事实[40 | 41]并不[40 | 41,...]意味着它知道函数可以返回一个空列表.