Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 泛型抽象类型的问题_Scala_Leon - Fatal编程技术网

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,那么现在已经修复了。