2016-12-13 3 views
1

Ich habe einen einfachen abstrakten Datentyp, einen Baum.Argumente mit variabler Länge mit generischen Typen scala

sealed trait Tree[A] 
case object EmptyTree extends Tree[Nothing] 
case class Leaf[A](value: A) extends Tree[A] 
case class Node[A](op: A => A, branches: List[Tree[A]]) extends Tree[A] 

Wie kann ich den Betrieb machen, dass ein Node eine variable Länge Anzahl von Argumenten vom Typ A zu akzeptieren hält?

Ein exemple:

def printAll(strings: String*) { 
    strings.foreach(println) 
} 

printAll empfängt eine variable Anzahl von Strings.

In der gleichen Weise wollte ich meinen Tree einen Betrieb op des Typs A* => A halten.

Ein möglicher Weg wäre, es ein List[A] zu erhalten, aber ich frage mich, ob es nicht eine direktere Möglichkeit, dies zu tun ist.


durch die Art und Weise kann ich auch branches: List[Tree[A]] in so etwas wie branches: Tree[A]* drehen. Ist das aus der Sicht des Designs sinnvoll?

Antwort

3

Sie können Seq verwenden in der Signatur, dann werden Sie in der Lage sein passieren varargs Funktionen

sealed trait Tree[A] 
case object EmptyTree extends Tree[Nothing] 
case class Leaf[A](value: A) extends Tree[A] 
case class Node[A](op: Seq[A] => A, branches: List[Tree[A]]) extends Tree[A] 

object Test { 
    Node[String](test[String], List()) 

    def test[A](elem: A*): A = ??? 
} 
+0

geht es zu testen, macht es Sinn, als Sie für Ihre Antwort –

+0

durch die Art und Weise, kann ich auch machen 'Zweige: Liste [Baum [A]])' wie 'Zweige: Baum [A] *'. Macht das aus einer Designperspektive Sinn? –

+0

Die varargs macht Sinn, wenn Sie eine Funktion haben möchten, die n Elemente als Parameter akzeptiert, aber es macht weniger Sinn, wenn Sie die Felder einer Klasse deklarieren. Aber es liegt an dir, es zu benutzen. – Mikel

Verwandte Themen