3

我决定在我的一些代码中添加类型定义,并运行 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 | ""]

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

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

1 回答 1

6

作为Erlang 类型规范[X]意思是“零个或多个类型元素的列表X”。在您的情况下,Xis 、40 | 41so "("、和都匹配此类型。没有办法将仅包含一个元素的列表表示为类型规范。")""()()"""

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

于 2013-07-22T11:53:32.267 回答