我编写了我自己的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但不输出终止符。
答案 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的第二个参数是初始化值,在这种情况下应该是空的(减少或类似的东西更合适而不是在这里折叠)。