2017-03-15 2 views
2

je suit la définition du trait:Nil: Liste [Int] en tant que paramètre

sealed trait List[+A] 

// `List` data type, parameterized on a type, `A` 
case object Nil extends List[Nothing] 

// A `List` data constructor representing the empty list 
/* Another data constructor, representing nonempty lists. Note that `tail` is another `List[A]`, 
which may be `Nil` or another `Cons`. 
*/ 
case class Cons[+A](head: A, tail: List[A]) extends List[A] 

et une fonction:

def add1(l: List[Int]): List[Int] = 
    foldRight(l, Nil:List[Int])((h,t) => Cons(h+1,t)) 

Ma question est, qu'est-ce que cela signifie Nil:List[Int]? Est-ce que cela signifie, je passe une liste Nil avec le type avec la notation Int?

+2

Ici, il est même que 'List.empty [Int]' – dveim

Répondre

2

Comme fold (et variantes) est de déterminer le paramètre de type basé sur la première liste des paramètres, vous ne pouvez pas simplement passer Nil, comme le type serait dérivé comme List[Nothing] (vous aussi voir la deuxième liste de paramètres ne correspondant pas). Vous pouvez utiliser type ascription pour dire le Nil est de type List[Int]. Vous pouvez également passer le List[Int] comme paramètre de type:

foldRight[List[Int]](l, Nil)((h,t) => Cons(h+1,t)) 

Pour la signature de référence, foldRight est la suivante:

def foldRight[B](z: B)(op: (A, B) => B): B