2014-11-21 4 views
1

Игра вокруг с реализацией списка функцииScala: Несоответствие типов при использовании левой складка

sealed trait List[+A] 

case object Nil extends List[Nothing] 
case class Cons[+A] (head:A, tail:List[A]) extends List[A] 

object List { 
    @tailrec 
    def foldLeft[A,B] (list: List[A], z:B)(f:(A,B) => B) : B = { 
    list match { 
     case Nil => z 
     case Cons(h,t) => foldLeft(t,f(h,z))(f) 
    } 
    } 

    def reverse[A] (list: List[A]) = { 
    foldLeft(list,Nil)(Cons(_,_)) 
    } 
} 

получение «Тип рассогласования, как ожидается (A, Nil.Type) => Nil.Type, фактическая: (A, Nil .Type) => Минусы [A] "из минус (,) в обратном методе.

Что я делаю неправильно?

ответ

6

Это очень распространенная ошибка при использовании Nil. Nil расширяет List[Nothing] так что вам нужно, чтобы помочь компилятору немного, чтобы правильно вывести фактический тип B:

def reverse[A] (list: List[A]) = { 
    foldLeft(list,Nil:List[A])(Cons(_,_)) 
    } 
Смежные вопросы