2016-12-13 16 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の引数の可変長番号を受け入れるように保持している操作を行うことができますか?

exemple:

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

printAllが文字列の可変数を受け取ります。

同じように、の操作opを保持するようにツリーを作りたかったのです。

可能な方法はList[A]を受け取ることですが、これを行うより直接的な方法はないのだろうかと思います。私もbranches: Tree[A]*のようなものにbranches: List[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]])'のようになります:ツリー[A] * '。 これは設計の観点から意味がありますか? –

+0

n要素をパラメータとして受け入れる関数を持たせたいが、クラスのフィールドを宣言しているときにはあまり意味がない場合、varargsは意味があります。しかし、それを使用するのはあなた次第です。 – Mikel

関連する問題