Scala使用foldLeft在字符串列表之间插入终止符

Scala使用foldLeft在字符串列表之间插入终止符,scala,recursion,foldleft,Scala,Recursion,Foldleft,我自己编写了foldLeft的递归定义,我想将其与函数jointTerminateLeft一起使用,该函数获取字符串列表和终止符,并使用这些字符串创建一个新字符串,所有字符串都由终止符分隔 例如,带有终止符的列表A、b、c、d;最终会成为一个;BCd 这是我的折页纸,我觉得很好,但我的终结者纸因为一些奇怪的原因不起作用,知道吗 def foldLeft [A,B] (xs:List[A], e:B, f:(B,A)=>B) : B = { def auxFoldLeft(xs: Lis

我自己编写了foldLeft的递归定义,我想将其与函数jointTerminateLeft一起使用,该函数获取字符串列表和终止符,并使用这些字符串创建一个新字符串,所有字符串都由终止符分隔

例如,带有终止符的列表A、b、c、d;最终会成为一个;BCd

这是我的折页纸,我觉得很好,但我的终结者纸因为一些奇怪的原因不起作用,知道吗

def foldLeft [A,B] (xs:List[A], e:B, f:(B,A)=>B) : B = {
  def auxFoldLeft(xs: List[A], e: B) : B = {
    xs match {
      case Nil => e
      case x::xs => auxFoldLeft(xs, f(e, x))
    }
  }
  auxFoldLeft(xs, e)
}

def joinTerminateLeft (xs : List[String], term : String) : String = {
  def f(s: String, s2: String) : String = s + s2
  xs match {
    case Nil => ""
    case x::xs => x + foldLeft(xs, term, f)
  }
}

当我使用a、b、c、d运行joinTerminateLeft时,由于某种原因,它会在b之后停止,并输出字符串c、d,但不使用终止符。

发生的情况是,您正在使用术语作为起始值。但e是一个累加器,每次迭代加上最后一次。所以,通过一次,你会得到;+但是下一次累加器是它的值,所以你得到| b+c

你需要的是一个不同的功能。您不需要将值添加到累加器中,而是需要将术语添加到值中,然后将其添加到累加器中

def joinTerminateLeft (xs : List[String], term : String) : String = {
  def f(s: String)(s2: String, s3: String) : String = s2 + s + s3
  xs match {
    case Nil => ""
    case x::xs => x + foldLeft(xs, "", f(term))
  }
}

以下是一个有效的代码片段:

def joinTerminateLeft (xs : List[String], term : String) : String = {
    def f(s: String, s2: String) : String = s + term + s2
    xs match {
        case Nil => ""
        case x::xs => x + foldLeft(xs, "", f)
    }
}

该术语只能在f中使用。foldLeft的第二个参数是初始化值,在本例中,该值应为空,或者使用类似的值来代替此处的fold left更合适。

这是一种实践吗?因为mkString;很好用。是的,是练习用的。我需要使用foldLeft来完成joinTerminateLeft,而不需要任何额外的方法,除了字符串连接之外,我认为这是必要的。另外,我不认为foldLeft是合适的函数,因为这里不需要初始值,就可以将列表作为字符串连接起来。具有类似reduce签名的函数可能更合适。它是用于家庭作业的,因此必须是可执行的。最肯定的不是最好的方法,但不幸的是我被迫这样做。谢谢你的建议,但是如果只使用一个参数列表调用它,它似乎不起作用。断言joinTerminateLeft列表a;==A.这只会返回一个任意想法?按照目前的方式,它会在值之间放置一个分隔符,当只有一个值时,中间没有空间来放置delimeter。如果您只想在每个字符串后输入值,请更改函数,将术语放在字符串的末尾,而不是s2+s3+s的开头,而不是只将尾部传递给foldLeft并在后面添加头部,只需将foldLeft应用于整个列表。