Algebraische Datentypen in Kotlin

Ich versuche herauszufinden, wie man algebraische Datentypen in Kotlin verwendet, also versuche ich, einen einfachen BinaryTree-Typ wie folgt zu implementieren.

sealed class Tree<T>{
  class Node<T>(val left: Tree<T>, val right: Tree<T>): Tree<T>()
  class Leaf<T>(val value: T): Tree<T>()
}

Das ist alles in Ordnung und lässt mich den folgenden Baum konstruieren:

val myTree1: Tree<Int> = Node(Leaf(4), Leaf(2))

Jedoch möchte ich auch einen "Leer" -Typ haben, damit ich Folgendes ausdrücken kann:

val myTree1: Tree<Int> = Node(Node(Leaf(4), Leaf(3)), Empty)

Ich habe Folgendes versucht:

sealed class Tree<T>{
  class Node<T>(val left: Tree<T>, val right: Tree<T>): Tree<T>()
  class Leaf<T>(val value: T): Tree<T>()
  object Empty: Tree()
}

Obwohl ich den Fehler erhalte, dass das Type-Argument beim Objekt Empty: Tree () erwartet wird, was eigentlich ziemlich logisch ist.

Ich habe es versuch

object Empty: Tree<T>()

Aber es ergab sich "Unaufgelöste Referenz: T". Als letzten Ausweg habe ich versucht, @ zu schreib

object Empty<T>: Tree<T>()

Aber der Compiler sagt "Typparameter sind für Objekte nicht erlaubt"

ibt es eine Möglichkeit, dies in Kotlin auszudrücken? Leer sollte ein Singleton sein, deshalb sollte es ein Objekt sein. Indem ich es zu einer Klasse mache, werden die Compilerprobleme gelöst, aber danach muss ich Klammern setzen => Empty (). Außerdem werden unnötige Objekte erstellt, obwohl es sich eigentlich um einen Singleton-Wert handeln sollte.

Ich würde mich über jede Hilfe zu diesem Thema freuen. :)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage