4

このコードが機能しない理由を理解するのに問題があります。Binary Treesセクション(http://aperiodic.net/phil/scala/s-99/)の99ScalaProblemsから入手しました。私には有効に見えます。NodeオブジェクトはNodeクラスのコンパニオンオブジェクトであり、ツリー上のリーフのコンストラクターを追加しています。しかし、コンパイルしようとすると、次のようになります。

<console>:10: error: too many arguments for method apply: (value: T)Node[T] in object Node

    def apply[T](value: T): Node[T] = Node(value, End, End)

両端を削除してもコンパイルエラーは発生しませんが、単一の値でノードを作成すると、無限ループに陥ります。したがって、applyはより多くのNodeオブジェクトを構築しており、それ自体をNodeクラスに関連付けていないように見えます。

どんな助けでも大歓迎です。

sealed abstract class Tree[+T]
case class Node[+T](value: T, left: Tree[T], right: Tree[T]) extends Tree[T] {
    override def toString = "T(" + value.toString + " " + left.toString + " " + right.toString + ")"
}
case object End extends Tree[Nothing] {
    override def toString = "."
}
object Node {
    def apply[T](value: T): Node[T] = Node(value, End, End)
}
4

1 に答える 1

12

私のために働きます(以下を参照)。それらを同じファイルで定義しましたか?


Welcome to Scala version 2.9.0.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :paste
// Entering paste mode (ctrl-D to finish)

sealed abstract class Tree[+T]
case class Node[+T](value: T, left: Tree[T], right: Tree[T]) extends Tree[T] {
    override def toString = "T(" + value.toString + " " + left.toString + " " + right.toString + ")"
}
case object End extends Tree[Nothing] {
    override def toString = "."
}
object Node {
    def apply[T](value: T): Node[T] = Node(value, End, End)
}

// Exiting paste mode, now interpreting.

defined class Tree
defined class Node
defined module End
defined module Node

scala> Node("123")
res0: Node[java.lang.String] = T(123 . .)

scala>

編集:loadコメントから: repl のコマンドがファイル内の各行を 1 つずつ解釈している ように見えます。そのコードはhereにあります。ただし、解釈される各行は独自のパッケージにコンパイルされるため (私は信じています)、これは REPL を使用しては機能しません。詳細については、このスレッドを参照してください。おそらく、これは REPL の将来の拡張機能になる可能性があります。ただし、原則として、コードに問題はありません。両方の:pasteモードを使用するか、または でコンパイルするだけで問題なくscalac動作します。


scala> case class A(i: Int, i2: Int)
defined class A

scala> object A {
     | def apply(i: Int): A = A(i, i)
     | }
:25: error: too many arguments for method apply: (i: Int)A in object A
       def apply(i: Int): A = A(i, i)

scala> object A {
         def apply(i: Int): A = new A(i, i)
       }
defined module A
warning: previously defined class A is not a companion to object A.
Companions must be defined together; you may wish to use :paste mode for this.

: JIRA で機能強化のリクエストが見つからなかったので、このイシューを作成しました

于 2011-06-09T02:54:41.333 に答える