2016-12-13 123 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持有接受A型的參數可變長度號碼的操作?

一種爲例:

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

printAll接收可變數目的串。

以同樣的方式,我想讓我的樹持有A* => A類型的操作op

一種可能的方法是讓它獲得List[A],但我想知道是否沒有更直接的方法來做到這一點。


的方式可我還反過來branches: List[Tree[A]]成類似branches: Tree[A]*。從設計的角度來看,這是否有意義?

回答

3

您可以在簽名中使用的序列,那麼你將能夠通過可變參數功能

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

順便說一下,可我也做'branches:List [Tree [A]]''像'branches:Tree [A] *'。 從設計的角度來看,這是否有意義? –

+0

當你想要一個接受n個元素作爲參數的函數時,可變參數是有意義的,但是當你聲明一個類的字段時它的意義不大。但是它取決於你使用它。 – Mikel