簡體   English   中英

尾遞歸在Scala中的findNextAndTail

[英]Tail Recursive findNextAndTail in Scala

如何在尾部遞歸下方進行findNextAndTail

  def uncons[A](s: Seq[A]): Option[(A, Seq[A])] = for (h <- s.headOption) yield (h, s.tail)

  // This works as-is. How can I make this function tail recursive?
  // @tailrec
  def findNextAndTail[A, B](parseFunction: A => Option[B], s: Seq[A]): Option[(B, Seq[A])] =
    for ((h, tail) <- uncons(s); r <- parseFunction(h) match {
      case Some(b) => Some((b, tail))
      case None => findNextAndTail(parseFunction, tail)
    }) yield r

  // Function for example usage
  def parseInt(s: String): Option[Int] = try {
    Some(Integer.parseInt(s))
  } catch {
    case _ => None
  }

  // Example usage of findNextAndTail
  def main(args: Array[String]): Unit = {
    val l = List("a", "b", "123", "x", "y", "z")
    val r = findNextAndTail(parseInt, l)
    // r=Some((123,List(x, y, z)))
    println(s"r=$r")
  }

試試看。

@annotation.tailrec
def findNextAndTail[A, B](parseFunction: A => Option[B]
                         ,s: Seq[A]): Option[(B, Seq[A])] =
  uncons(s) match {
    case Some((h, tail)) =>
      parseFunction(h) match {
        case Some(b) => Some((b, tail))
        case None => findNextAndTail(parseFunction, tail)
      }
    case _ => None
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM