Я бы не стал называть этот список списком, так как он не говорит, что содержится в этих списках.Структура - это дерево, точнее лиственное дерево, где данные есть только в листьях.Это будет:
sealed trait Tree[+A]
case class Node[+A](children: Tree[A]*) extends Tree[A]
case class Leaf[+A](value: A) extends Tree[A]
, затем добавьте карту методов, чтобы применить функцию к каждому значению в дереве
sealed trait Tree[+A] {
def map[B](f: A => B): Tree[B]
}
case class Node[+A](children: Tree[A]*) extends Tree[A] {
def map[B](f : A => B) = Node(children.map(_.map(f)): _*)
}
case class Leaf[+A](value: A) extends Tree[A] {
def map[B](f: A => B) = Leaf(f(value))
}
Тогда ваш ввод:
val input = Node(Leaf(1), Leaf(2), Node(Leaf(5), Leaf(6)), Leaf(3))
И если вы позвоните input.map(_ + 1)
, вы получите свой вывод
Отображение результата несколько уродливо из-за дерева varargs [A] *.Вы можете улучшить, добавив в Узле override def toString = "Node(" + children.mkString(", ") + ")"
. Вы можете предпочесть метод только в одном месте, либо вне классов, либо непосредственно в Дереве.Здесь, как метод в Tree
def map[B](f: A => B): Tree[B] = this match {
case Node(children @ _*) => Node(children.map(_.map(f)): _*)
case Leaf(v) => Leaf(f(v))
}
Работа нетипизированным способом, как в Python, не очень похожа на scala, но может быть выполнена.
def recurse(x: Any) : Any = x match {
case list : List[_] => list.map(recurse(_))
case value : Int => value + 1
}
(помещение значений непосредственно в список. Ваша карта (словарь) с ключом "i" усложняет его и заставляет принять предупреждение компилятора, поскольку нам пришлось бы принудительно привести приведение, которое не может быть проверено,а именно, что карта принимает строку в качестве ключей: case map: Map [String, _])
Использование case Elem(content: Any)
звучит для меня как не обеспечивающее дополнительной безопасности по сравнению с помещением значений непосредственно в List, хотягораздо более многословный, и ни одно из безопасности и ясности, называя это деревом и различая узлы и листья, не будучи заметно более кратким.