Scala 泛型抽象类型的问题
我有一个抽象堆栈类型,如下所示Scala 泛型抽象类型的问题,scala,leon,Scala,Leon,我有一个抽象堆栈类型,如下所示 抽象类堆栈[T]{ def空:堆栈[T] def pop():(选项[T],堆栈[T]) def推送(e:T):堆栈[T] 定义大小:BigInt } 我想验证pop是否返回最后一个推送的元素: //好的 def test_v1[T](e:T,s:Stack[T]):布尔={ s、 按下(e).pop()。_1匹配{ 案例部分(e2)=>e==e2 大小写=>false } }持有 //失败 def test_v2[T](e:T,s:Stack[T]):布尔={
抽象类堆栈[T]{
def空:堆栈[T]
def pop():(选项[T],堆栈[T])
def推送(e:T):堆栈[T]
定义大小:BigInt
}
我想验证pop
是否返回最后一个推送的元素:
//好的
def test_v1[T](e:T,s:Stack[T]):布尔={
s、 按下(e).pop()。_1匹配{
案例部分(e2)=>e==e2
大小写=>false
}
}持有
//失败
def test_v2[T](e:T,s:Stack[T]):布尔={
s、 push(e).pop()。_1==Some(e)
}持有
这两个引理是等价的,但Leon未能在第二个引理中识别类型参数。有趣的是,Leon在
Stack
是具体的或非通用的(参见下面的链接以获取示例)。这是Leon的特色还是只是一个bug
可以找到完整的示例代码。我在您的gist链接(在“此处可以找到”)中尝试了该示例,它在当前版本的Leon中工作,包括在线和git存储库。所以,如果这是一个bug,它现在已经修复了。如果您有任何相关的问题,我们很乐意回答,因为Leon目前只支持对象和case类,因此与full Scala相比存在差异。您不应该用一些(e)来包装e-它将在可为null的e上不正确地工作。用选项(e)代替。从错误信息判断,我认为这是一个bug。不同的
T
s之间存在类型不匹配。我在gist链接中尝试了该示例(在“可以在此处找到”)并且它在当前版本的Leon中有效,包括在线版本和git存储库中。所以,如果这是一个bug,那么现在已经修复了。