2016-12-13 13 views
1

У меня есть простой абстрактный тип данных, дерево.аргументы переменной длины с общими типами 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] 

Как я могу сделать операцию, что Node держит принимать переменное число длины аргументов типа А?

Exemple:

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

printAll принимает переменное число строк.

Точно так же я хотел, чтобы мое дерево удерживало операцию op типа A* => A.

Возможным способом было бы заставить его получить List[A], но я задаюсь вопросом, нет ли более прямого способа сделать это.


кстати может я также превратить branches: List[Tree[A]] в нечто вроде branches: Tree[A]*. Это имеет смысл с точки зрения дизайна?

ответ

3

Вы можете использовать Seq в подписи, то вы будете в состоянии передать переменную длину функция

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

собирается проверить это, это имеет смысл, чем вы за ваш ответ –

+0

, кстати, могу я также сделать 'branch: List [Tree [A]])' like 'branches: Tree [A] *'. Это имеет смысл с точки зрения дизайна? –

+0

varargs имеет смысл, если вы хотите иметь функцию, которая принимает n элементов в качестве параметра, но это имеет меньшее значение, когда вы объявляете поля класса. Но это зависит от вас, чтобы использовать его. – Mikel

 Смежные вопросы

  • Нет связанных вопросов^_^