Skip to content

Instantly share code, notes, and snippets.

@psttf
Created February 24, 2021 19:51
Show Gist options
  • Save psttf/6ab0d8645d974c1eb9714d4bdcdffc87 to your computer and use it in GitHub Desktop.
Save psttf/6ab0d8645d974c1eb9714d4bdcdffc87 to your computer and use it in GitHub Desktop.
// "фиксированная" структура
sealed trait BinTree
final case class BinNode(t1: BinTree, t2: BinTree) extends BinTree
final case class Leaf(v: Int) extends BinTree
// в фиксированном варианте возможно только создание простых деревьев,
// их структура заранее зафиксирована в определениях BinNode и Leaf
BinNode(Leaf(1),BinNode(Leaf(2),Leaf(3)))
// к примеру, невозможно создать дерево с необязательными элементами
// оно не скомпилируется
// BinNode(Option(Leaf(1)),Option(BinNode(Leaf(2),None)))
// параметризованная структура
sealed trait BinTreeF[A]
final case class BinNodeF[A](t1: A, t2: A) extends BinTreeF[A]
final case class LeafF[A](v: Int) extends BinTreeF[A]
// параметризованный вариант поддерживает как простые деревья
BinNodeF(LeafF(1),BinNodeF(LeafF(2),LeafF(3))): BinTreeF[_ <: BinTreeF[_]]
// так и другие варианты вложенных конструкций,
// следующих общим правилам, определнным в BinNodeF и LeafF
// к примеру, деревьев с необязательными узлами (пропусками или "дырами")
BinNodeF(Option(LeafF(1)),Option(BinNodeF(LeafF(2),None))): BinTreeF[Option[_ <: BinTreeF[_]]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment