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' 时才会退出。
我试图弄清楚如何使用尾递归获取用户输入的列表,然后将此 "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' 时才会退出。