2015-10-29 2 views
3

у меня есть абстрактный тип стека следующегоПроблем с родовыми абстрактными типами

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.

+0

Вы не должны обертывать e Some (e) - он будет работать некорректно при нулевом e. Вместо этого используйте опцию (e). – Rumoku

+0

Судя по сообщению об ошибке, я думаю, что это ошибка. Существует несовпадение типов между различными 'T'. – larsrh

+0

Я попробовал пример в ссылке gist (под «можно найти здесь здесь»), и он работает в текущей версии Leon, как в Интернете, так и в репозитории git. Итак, если это ошибка, она исправлена. – vkuncak

ответ

1

Я попробовал пример в вашей ссылке gist (под «можно найти здесь»), и он работает в текущей версии Леона, как в Интернете, так и в репозитории git. Итак, если это ошибка, она исправлена. Если у вас есть какие-то связанные вопросы, мы с удовольствием ответим, потому что Леон в это время поддерживает только объекты и классы классов, поэтому есть различия по сравнению с полной Scala.

Смежные вопросы