使用typer的意外结果

时间:2013-07-22 11:38:24

标签: types erlang

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

我选择了一些结果来检查每件事情是否正常,并找到了我不理解的结果:

par(true, o) -> "(";
par(true, f) -> ")";
par(_, _) -> "".

产生规范:

-spec par(boolean(),'f' | 'o') -> [40 | 41].

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

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

之类的内容

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

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(_, _) -> "".

1 个答案:

答案 0 :(得分:5)

作为Erlang type specification[X]表示“类型为X的零个或多个元素的列表”。在您的情况下,X40 | 41,因此"("")""()()"""都符合此类型。没有办法将一个元素列表恰好表示为类型规范。

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