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

时间:2017-01-23 20:06:27

标签: scala recursion foldleft

我编写了我自己的foldLeft的递归定义,我希望将它与此函数joinTerminateLeft一起使用,该函数获取字符串列表和终结符,并创建一个新的字符串字符串全部由终结符分隔。

例如List("a", "b", "c", "d"),终结者;最终会成为a;b;c;d;

以下是我的foldLeft我认为没问题,但terminateLeft因某些奇怪的原因而无法工作?

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运行joinTerminateLeft时,由于某种原因它在B之后停止并输出字符串c,d但不输出终止符。

2 个答案:

答案 0 :(得分:1)

您使用term作为起始值会发生什么。但是e是一个累加器,每次迭代都会添加到最后一个。所以经历一次,你得到 var certificationData = Configuration["auth0:certificate"]; var certificate = new X509Certificate2(Convert.FromBase64String(certificationData)); var options = new JwtBearerOptions() { Audience = Configuration["auth0:clientId"], Authority = Configuration["auth0:authority"], AutomaticChallenge = true, AutomaticAuthenticate = true, TokenValidationParameters = { ValidIssuer = Configuration["auth0:authority"], ValidAudience = Configuration["auth0:clientId"], IssuerSigningKey = new X509SecurityKey(certificate) } }; app.UseJwtBearerAuthentication(options); ,但下次累加器的值是这样的,所以你得到; + b

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

|b + c

答案 1 :(得分:0)

这是一个有效的代码段:

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的第二个参数是初始化值,在这种情况下应该是空的(减少或类似的东西更合适而不是在这里折叠)。