【问题标题】:unexpected result using typer使用 typer 的意外结果
【发布时间】:2013-07-22 19:53:32
【问题描述】:

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

【问题讨论】:

    标签: types erlang


    【解决方案1】:

    作为Erlang type specification[X] 表示“零个或多个X 类型元素的列表”。在您的情况下,X40 | 41,所以 "("")""()()""" 都匹配这种类型。没有办法将仅包含一个元素的列表表示为类型规范。

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

    【讨论】:

    • 谢谢,我不记得...的意思了,虽然它用在了其他结果中。
    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    相关资源
    最近更新 更多