Scala-列表上的标准递归模式匹配



给定:

def readLines(x: String): List[String] = Source.fromFile(x).getLines.toList
def toKVMap(fName : String): Map[String,String] =
  readLines(fName).map(x => x.split(',')).map { case Array(x, y) => (x, y) }.toMap

我希望能够获取一个字符串和替换文件列表并替换包围的项目。因此,如果我有:

replLines("Hello",["cat"])cat包含ello,i!,我想返回Hi!

我尝试了:

def replLines(inpQ : String, y : List[String]): String = y match { 
  case Nil => inpQ
  case x::xs => replLines(toKVMap(x).fold(inpQ) {
    case ((str: String), ((k: String), (v: String))) =>
      str.replace("[" + k + "]", v).toString
  }, xs)
}

我认为语法很接近,但不完全存在。我做错了什么?

您要寻找的很可能是这样(请注意foldLeft[String]而不是fold

def replLines(inpQ: String, y: List[String]): String = y match {
    case Nil => inpQ
    case x :: xs => replLines(toKVMap(x).foldLeft[String](inpQ) {
        case ((str: String), ((k: String), (v: String))) =>
            str.replace("[" + k + "]", v)
    }, xs)
}

fold概括了折叠初始参数,并认为它为 Serializable,而不是 StringfoldLeft(和foldRight,如果您喜欢从末端启动替换(允许您明确指定您在

上折叠的类型

编辑:实际上,您甚至根本不需要递归模式匹配,因为您可以将替代品直接映射到列表:

def replLines2(inpQ: String, y: List[String]): String =
  y.flatMap(toKVMap).foldLeft[String](inpQ) {
    case (str, (k, v)) => str.replace(s"[$k]", v)
  }

最新更新