Я пытаюсь выяснить, как использовать алгебраические типы данных в Kotlin, поэтому я пытаюсь реализовать базовый тип BinaryTree следующим образом.
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>()
}
Все это прекрасно, и позволяет мне построить следующее дерево:
val myTree1: Tree<Int> = Node(Leaf(4), Leaf(2))
Однако я хотел бы также иметь "пустой" тип, поэтому я могу выразить следующее:
val myTree1: Tree<Int> = Node(Node(Leaf(4), Leaf(3)), Empty)
Я попробовал следующее:
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()
}
Хотя я получаю ошибку, что аргумент типа ожидается на объекте Empty: Tree(), что на самом деле довольно логично.
Я пробовал
object Empty: Tree<T>()
Но это привело к "неразрешенной ссылке: T". В крайнем случае я попытался написать
object Empty<T>: Tree<T>()
Но компилятор говорит: "Параметры типа не разрешены для объектов"
Есть ли способ выразить это в Котлине? Пустой должен быть синглтон, поэтому он должен быть объектом. Сделав его классом, он решает проблемы с компилятором, но после этого мне нужно поставить круглые скобки после этого = > Empty(). Кроме того, он создает ненужные объекты, в то время как это действительно должно быть одно значение.
Буду признателен за любую помощь по этой проблеме.:)