Types 使用打字机时出现意外结果

Types 使用打字机时出现意外结果,types,erlang,Types,Erlang,我决定在一些代码中添加类型定义,并运行Typer以获得一个起点(Erlang15B02,Typer0.9.4) 我挑选了一些结果来检查是否一切正常,发现这个结果我不明白: par(true, o) -> "("; par(true, f) -> ")"; par(_, _) -> "". 产生规范的文件: -spec par(boolean(),'f' | 'o') -> [40 | 41]. 我可以理解输入参数,因为这个函数没有导出,我的代码只调用布尔表达式作为第一

我决定在一些代码中添加类型定义,并运行Typer以获得一个起点(Erlang15B02,Typer0.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(_, _) -> "".
例如,
[X]
表示“类型为
X
的零个或多个元素的列表”。在您的例子中,
X
40 | 41
,因此
“(“
”)”
“()”
都匹配此类型。无法将仅包含一个元素的列表表示为类型规范


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

谢谢,我不记得。。。尽管在其他结果中使用了它。