我决定在我的一些代码中添加类型定义,然后运行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(_, _) -> "".
答案 0 :(得分:5)
作为Erlang type specification,[X]
表示“类型为X
的零个或多个元素的列表”。在您的情况下,X
为40 | 41
,因此"("
,")"
,"()()"
和""
都符合此类型。没有办法将一个元素列表恰好表示为类型规范。
可以将包含至少一个元素的列表指定为[X,...]
。 typer说[40 | 41]
而不是[40 | 41,...]
这一事实意味着它知道该函数可以返回一个空列表。