繁体   English   中英

当将列表追加到列表列表时,Rascal会删除类型信息

[英]Rascal erases type information when appending a list to a list of lists

我有以下功能:

public list[list[loc]] populateBeforeRemoval(){
    list[list[loc]] dupList = [];
    map[int, list[loc]] finalizedDups = ();

    // Here some stuff is added to the finalizedDups map, however, I have omitted it for simplicity.

    for(dup <- finalizedDups){
        dupList+=finalizedDups[dup];
    }
    return dupList;
}

但是,当我运行此函数时,将得到以下输出:

|project://TestProject/src/astCreation.rsc|(4955,3,<142,40>,<142,43>): Expected list[list[loc]], but got list[value]
Advice: |http://tutor.rascal-mpl.org/Errors/Static/UnexpectedType/UnexpectedType.html|

当我单击该消息时,它指向代码中的返回值( dupList )。 似乎增加了finalizedDups[dup]会删除list[loc]的类型( list[loc] )。 这应该不可能吗?

为了完整起见,下面是整个(实际)功能:

public list[list[loc]] populateBeforeRemoval(list[list[loc]] dupList, list[loc] potentialDuplicates, list[loc] newPotentialDuplicates, loc location, int lineNumber){
    map[int, list[loc]] finalizedDups = ();
    for(dup <- potentialDuplicates, getSourceLength(dup)>=6){
        bool sameIn = false;
        for(pot <- newPotentialDuplicates){
            if(pot.uri == dup.uri && pot.begin.line == dup.begin.line){
                sameIn = true;
            }
        }
        if(!sameIn){
            int srcLength = getSourceLength(dup);
            if(srcLength in finalizedDups){
                finalizedDups[srcLength]+=dup;
            } else {
                location.end.line = lineNumber-1;
                location.begin.line = lineNumber-srcLength-1;
                finalizedDups[srcLength]=[location, dup];
            }
        }
    }
    for(dup <- finalizedDups){
        dupList+=finalizedDups[dup];
    }
    return dupList;
}

更新:

在开始时,此代码在Eclipse IDE中显示了很多错误。 dup重命名为其他名称后,大多数错误都消失了。 可能是因为dup是我导入的List.rschttp://tutor.rascal-mpl.org/Rascal/Libraries/Prelude/List/dup/dup.html )中的函数。 似乎与Eclipse插件有关,显示为错误的行在运行时不会产生错误。

但是,主要问题尚未解决。 我认为此问题是由于将列表追加到列表列表而引起的。

好的代码。 让我们来看看。 只是从读取未运行开始,我怀疑+ =运算符将元素类型扩展为“值”。

要知道的事情:

  • 列表上的串联和元素添加都“ + =”(仍然)超载
  • 如果两种语义混合使用,则分配的新元素类型是整个列表的类型与其元素类型之间的最小上限,通常为“值”
  • 它有助于将有问题的赋值的右方包裹在列表括号中,以强制使用“ + =”的串联语义

不请自来的旁注:理解和关系运算符通常更快:

for(dup <- finalizedDups){
    dupList+=finalizedDups[dup];
}

可能是:dupList + = [* finalizedDups [dup] | dup <-finalizedDups)];

+ =然后是单个串联,生成器像以前一样循环键,而*将映射中的每个列表值拼接到结果列表中。 我只是想一想就没有测试。 这样做更快,因为Rascal可以在列表理解完成之前使用瞬态可变状态,而for循环替代方案则不假设任何内容,仅使用不可变的内部API。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM