JVMNode的Scala窥孔优化

时间:2018-12-19 03:50:50

标签: scala

我不确定如何修改递归方法调用以处理JVMNode列表,我将传递该递归方法以进行检查并替换为其他JVM命令以窥视该语言。每种情况都会在列表中存储一个不同的JVM命令,然后根据需要替换它,以进行优化,然后传递给新的优化列表。

def processSequence(oldlist:List[JVMNode], newlist:List[JVMNode]):List[JVMNode] = {

  def listMatch(list: List[Int], newlist:List[JVMNode]): Int = {
    list match {
      case Nil => currentSum
      case x :: xs => listMatch(list[x], newlist[xs])
    }
  }
    listMatch(list, 0)
}

1 个答案:

答案 0 :(得分:0)

从您要实现的目标的描述来看,您应该可以使用标准的List方法来完成您想要的事情。

如果要用另一个节点替换一个JVMNode,请使用map并传递一个函数,该函数将旧节点转换为现在优化的新节点(如果没有优化,则返回原始节点)

如果原始列表中的单个JVMNode可能会产生不同数量的优化节点,请使用flatMap并传递一个将旧节点转换为新节点列表的函数。

如果要通过依次处理每个JVMNode来提取单个值,请使用foldLeft并传递一个初始值和一个基于节点内容更新该值的函数。

如果您确实需要使用递归函数来处理List,它可能看起来像这样:

def myMap[T](list: List[T], f: T => T): List[T] = {
  @annotation.tailrec
  def loop(list: List[T], newList: List[T]): List[T] = {
    list match {
      case Nil => newList.reverse
      case x :: xs =>
        val newX = f(x)

        loop(xs, newX +: newList)
    }
  }

  loop(list, Nil)
}

这与map相同,但是应该给出如何在List上构造递归函数的想法。 loop函数中的代码可以查看List中的所有节点,以防需要查看节点的上下文。它还可以选择要添加到结果中的节点数,甚至可以根据需要修改以前的节点。

这里要注意两件事:

  • 结果作为参数传递给loop,因此loop是尾递归函数,可以进行优化。

  • 以相反的顺序构建结果,然后在末尾反转,因为添加到List的前面比添加到List的末尾要快得多。