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