循环通过元组结构中的叶子

时间:2016-03-14 16:33:00

标签: scala types functional-programming purely-functional

假设我有一个函数fn,它接受​​以下形式的元组:

fn(
 "a" -> (
   "b" -> "k",
   "c" -> 293,
   "d" ->(
     "e" -> Seq("i", "j"),
     "f" -> Seq(1, 2)
     )
   ),
 "g" -> (
   "h" -> true
  )
)

我不知道如何实现fn能够遍历每一片叶子(" b"," c",&#34 ; e"," f"最后" h")每次知道叶子自己的父母。

无形似乎是一种解决方案,即使我不知道如何实现它。

注意:首选香草scala方法(如果可能的话)。 注意:我知道我有一个Tuple2(String, T),其中T可以是另一个元组(String,T),一个字符串,一个数字,一个布尔值或一个Seq [V]。 注意:Seq [V]其中V可以是字符串,数字或布尔值。

1 个答案:

答案 0 :(得分:1)

我不确定你是什么意思"每次知道叶子自己的父母",但你应该能够调整它来做你需要的事情:

  def traverseLeaves(p: Product)(visitor: (String,Any) => Unit):Unit = p match { 
    case (parent:String, child:Seq[_]) => visitor(parent, child)
    case (_:String, child: Product) => traverseLeaves(child)(visitor)
    case (parent:String, child) => visitor(parent, child)
    case _ => p.productIterator.foreach { 
      case child:Product => traverseLeaves(child)(visitor)
      case _ => ???
    }
  }

注意,如果它在任何地方找到超过两个元素的元组,包含除元组之外的任何其他元素,则会抛出异常,因为从您的问题中不清楚在这种情况下您打算做什么。如果您想以不同方式处理它,请将???更改为将处理该情况的逻辑。