【问题标题】:Loop through leaf in a tuple structure遍历元组结构中的叶子
【发布时间】:2016-06-29 19:33:45
【问题描述】:

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

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

我不知道如何实现fn 以便能够循环遍历每个叶子(分别是“b”、“c”、“e”、“f”,最后是“h”)知道每次叶自己的父母。

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

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

【问题讨论】:

  • 叶子知道它的父母是什么意思?
  • 另外,这是在没有 Shapeless 的情况下完全可以完成的事情的类别(你不需要宏驱动的通用机器等),但它会更多,更多详细。
  • 如果类型在编译时已知,您可以使用宏来匹配类型并生成叶子序列。如果不是,您可以使用模式匹配。
  • 这意味着当我遍历叶子时(假设我在“e”上),我知道“b”有“d”和“a”作为父级,这就是我的意思通过“叶子知道它的父母”

标签: scala types functional-programming purely-functional


【解决方案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 _ => ???
    }
  }

注意,如果它在任何地方发现一个多于两个元素的元组,并且包含除元组以外的任何内容,这将引发异常,因为从您的问题中不清楚您打算在这种情况下做什么。如果您想以不同的方式处理它,请将??? 更改为将处理该情况的逻辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多