0

我编写了自己的 a 递归定义,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)
  }
}

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

4

2 回答 2

1

发生的情况是您使用术语作为起始值。但是 e 是一个累加器,每次迭代都会添加到最后一次。所以通过一次,你会得到; + b,但下一次累加器就是那个值,所以你得到|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))
  }
}
于 2017-01-23T20:50:14.470 回答
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 的第二个参数是初始化值,在这种情况下应该为空(reduce 或类似的东西会更合适,而不是 fold left 在这里)。

于 2017-01-23T21:00:29.930 回答