2012-12-24 3 views
6

Ich versuche, eine Liste der Größe S in N aufzuspalten, wo es, dass N, M Summe S. up bekannt ist, wird dadurch nicht kompilieren:Wie eine scala Liste mit formlos splitAt

def splitIt[N <: Nat, 
      M <: Nat, 
      S <: Nat](u: Sized[List[Int], N] {type A = N}, 
         v: Sized[List[Int], M] {type A = M}, 
         t: Sized[List[Int], S] {type A = S})(implicit sum: SumAux[N, M, S]): Unit = { 
    val z = t.splitAt[N] 
} 

Fehler

No implicit view available from List[Int] => scala.collection.GenTraversableLike[S,List[Int]]. 

not enough arguments for method sizedOps: (implicit evidence$2: List[Int] => scala.collection.GenTraversableLike[S,List[Int]])shapeless.SizedOps[S,List[Int],S]. Unspecified value parameter evidence$2. 

Schluss richtige Version

def splitIt[N <: Nat, 
      M <: Nat, S <: Nat](u: Sized[List[Int], N] {type A = Int}, 
           v: Sized[List[Int], M] {type A = Int}, 
           t: Sized[List[Int], S] {type A = Int})(implicit sum: DiffAux[S, N, M], toInt: ToInt[N]): Unit = { 
    val z = t.splitAt[N] 
} 

Antwort

5

Die typeA muss der Typ der Elemente der Liste sein, nicht wieder die Größe Argument. Deshalb versucht es, zu GenTraversableLike[A, List[Int]] zu konvertieren. Sie müssen A auf Int in jedem Fall setzen.

+2

+1, aber dies ist nur der erste Schritt-Wissen 'SumAux [N, M, S]' nicht erhalten Sie die 'Diff [S, N]' Sie müssen die Liste (leider) zu teilen, und Sie müssen auch ein "ToInt" für "N" hinzufügen. –

+1

Die 'A's wurden geändert und ein' toInt' implizit hinzugefügt. Wie füge ich 'Diff' hinzu? – Peteris

+2

@Peteris: Sie können den 'SumAux' entfernen (außer Sie benötigen ihn aus einem anderen Grund in Ihrem echten Code) und fügen entweder' Diff [S, N] 'oder' DiffAux [S, N, M] 'hinzu. –