Scala:连接两个不可变列表

Scala: Concatenate two immutable Lists

我试图弄清楚如何使用尾递归获取用户输入的列表,然后将此 "temporary list" 添加到 finalList 并一次又一次地重试,但出于某种原因我不能'不知道为什么我的代码不起作用?

编辑:这是对工作示例解决方案的更新!

  val finalList = List[String]()


  def exerciseSelector(finalList: List[String]) {
    val user = scala.io.StdIn.readLine("choose:")
    user match {
      case "add" =>  exerciseSelector(finalListAdd(finalList,addToList(List[String]())))
      case "print" => println(finalList) ; exerciseSelector(finalList)
      case "stop" => sys.exit()
    }
  }

  def addToList(acc: List[String]): List[String] = {
    val input = scala.io.StdIn.readLine("input:")
    input match {
      case "stop" => acc
      case input: String => addToList(input :: acc)

    }}

def finalListAdd(acc: List[String], list: List[String]): List[String] =  list match{
    case Nil => acc
    case h :: t => finalListAdd(h :: acc, t)
  }

exerciseSelector(finalList)

我可能错了,我自己没有尝试过,但我猜想 addToList 永远没有机会 return 累积列表。

在你说 "stop" 的那一刻,你在 return 输入 acc 值之前调用了 exerciseSelector()

此外,finalListAdd 的结果似乎在某处丢失了。它可能应该作为 exerciseSelector() 的参数给出以便能够打印。

你能试试吗?

 def exerciseSelector(finalList: List[String]) {
    val user = scala.io.StdIn.readLine("choose:")
    user match {
      case "add" =>  exerciseSelector(finalListAdd(finalList,addToList(List[String]())))
      case "print" => println(finalList)
      case "stop" => sys.exit()
    }
  }

  def addToList(acc: List[String]): List[String] = {
    val input = scala.io.StdIn.readLine("input:")
    input match {
      case "stop" => acc
      case input: String => addToList(input :: acc)

    }}

def finalListAdd(acc: List[String], list: List[String]): List[String] =  list match{
    case Nil => acc
    case h :: t => finalListAdd(h :: acc, t)
  }

exerciseSelector(List[String]())

exerciseSelector() 的变化已经向上移动到 exerciseSelector() 自身。 finalList 作为 exerciseSelector() 的参数给出。第一次调用时给出的默认值。

首先

val tempList = List[String]()
val finalList = List[String]()

没有必要,因为您无法真正添加到这些列表中,它们都是不可变的并且 final 值。

finalList returns 一个 List[String] (据我所知)应该是您要打印的列表。

然而,

的结果
case "add" => finalListAdd(finalList,addToList(tempList)) 

从未在任何地方使用过。

我不确定具体要求,但实际上我相信你的代码可以减少到

  @tailrec
  def exerciseSelector(currentList: List[String]): Unit = {
    val user = scala.io.StdIn.readLine("choose:")
    user match {
      case "stop" => sys.exit()
      case "print" =>
        println(currentList)
        exerciseSelector(currentList)
      case "add" => exerciseSelector(currentList)
      case input: String => exerciseSelector(input :: currentList)
    }
  }

  exerciseSelector(List.empty)

在这里,'add' 的情况是多余的。

该代码会将任何不匹配的字符串添加到列表中。

在 'print' 上它将打印出当前列表。

并且只有在 'stop' 时才会退出。