у меня есть абстрактный тип стека следующегоПроблем с родовыми абстрактными типами
abstract class Stack[T] {
def empty : Stack[T]
def pop() : (Option[T], Stack[T])
def push (e : T) : Stack[T]
def size : BigInt
}
Я хотел бы, чтобы убедиться, что pop
возвращает последний толкнули элемент:
// ok
def test_v1[T] (e : T, s : Stack[T]) : Boolean = {
s.push(e).pop()._1 match {
case Some(e2) => e == e2
case _ => false
}
} holds
// failed
def test_v2[T] (e : T, s : Stack[T]) : Boolean = {
s.push(e).pop()._1 == Some(e)
} holds
две лемм эквивалентны , но Леон не может идентифицировать параметры типа во второй лемме. Интересно, что у Леона нет проблем, если Stack
является конкретным или не общим (см. Приведенную ниже ссылку). Это особенность Леона или просто ошибка?
Полный код примера можно найти here.
Вы не должны обертывать e Some (e) - он будет работать некорректно при нулевом e. Вместо этого используйте опцию (e). – Rumoku
Судя по сообщению об ошибке, я думаю, что это ошибка. Существует несовпадение типов между различными 'T'. – larsrh
Я попробовал пример в ссылке gist (под «можно найти здесь здесь»), и он работает в текущей версии Leon, как в Интернете, так и в репозитории git. Итак, если это ошибка, она исправлена. – vkuncak