2017-08-15 2 views
0

ich eine Störung erhalte, während meine Scala-Code auf IntelliJ läuft (mit Scala 2.11.8):Scala Arbeitsblatt werfen Fehler

package week4 

/** 
    * Created by BigB on 15/08/17. 
    */ 
trait List[T] { 
    def isEmpty: Boolean 
    def head: T 
    def tail: List[T] 
} 

class Cons[T](val head: T, val tail: List[T]) extends List[T] { 
    override def isEmpty: Boolean = false 
} 

class Nil[T] extends List[T] { 
    override def isEmpty: Boolean = true 

    override def head: T = throw new NoSuchElementException("Nil.head") 

    override def tail: List[T] =throw new NoSuchElementException("Nil.tail") 
} 

Mein Scala Arbeitsblatt hat:

import week4._ 

object nth { 
    def nth[T](n: T, l: List[T]): T = { 
    if (l.isEmpty) throw new IndexOutOfBoundsException 
    else if (n==0) l.head 
    else nth(n-1, l.tail) 
    } 

    val l1 = new Cons(1, new Cons(2, new Cons(2, new Nil))) 

    nth(2, l1) 
} 

Fehler:

Fehler: (9, 20) nicht gefunden: Typ Cons lazy val l1 = new Cons (1, neue Cons (2, neue Nachteile (2, neu Nil))) ^

Fehler: (6, 16) Wert - ist kein Mitglied des Typ-Parameter T else nten (n-1, l.tail) ^

+0

Sie müssen zuerst week4 Paket zusammenstellen, dann versuchen Arbeitsblatt zu laufen. Zumindest funktioniert es bei mir ohne Code-Änderung – dhana

Antwort

1

Ihre nth parametriert mit T. Darin nennen Sie es rekursiv mit nth(n-1, ...).

Was ist der Typ von n-1? n ist vom Typ T, 1 ist vom Typ Int der resultierende Typ kann nicht vom Typ T abgeleitet werden, so dass es fehlschlägt.

Ich schlage vor, einen zusätzlichen Parameter übergeben, vielleicht:

object nth { 
    def nth[T](n: T, l: List[T], dec: T => T): T = { 
    if (l.isEmpty) throw new IndexOutOfBoundsException 
    else if (n==0) l.head 
    else nth[T](dec(n), l.tail, dec) 
    } 

    val l1 = new Cons(1, new Cons(2, new Cons(2, new Nil))) 

    nth[Int](2, l1, _ - 1) 
} 

bearbeiten

in einer Klasse meine Version des Codes Putting, dass extends App funktioniert wie erwartet. Ich habe es aufgegeben, Arbeitsblätter zu verwenden. Zu unzuverlässig oder zu viele versteckte Geheimnisse.

bearbeiten No.2

rechts geklickt das Arbeitsblatt Recompile <ws>.sc und Run .sc` gedrückt und es funktionierte ... Oh well Arbeitsblätter!

enter image description here

+0

Sogar wenn man 'T' zu' Int' wechselt, gibt es ein rotes '-'-Zeichen. Das sollte ein anderes Problem sein. –

+0

Sie haben Recht. Müssen die Dinge explizit parametrisieren :) – pedromss