编程任务: 面向对象集: def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet, Blows My Mind



看来我陷入了死胡同!好吧,这是我几乎完成的编程任务,但是我已经陷入了几天的巨大问题!

def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = {
    if(p(elem))
        acc.incl(elem)
    if(!(left isEmpty))
        left filterAcc(p, acc)
    if(!(right isEmpty))
        right filterAcc(p, acc)
    acc
}

经过多次打印和调试,似乎 acc.incl(elem) 似乎不起作用!我不知道为什么,但它没有添加元素。我这样称呼它:

 def filter(p: Tweet => Boolean): TweetSet = filterAcc(p, new Empty)

同样,这是来自编程作业:Scala 中的面向对象集。任何帮助将不胜感激。谢谢。

看起来您假设 incl 方法会改变TweetSet。由于作业看起来像来自 Scala 中的函数式编程原理,我希望 TweetSet 类型是不可变的,因此您必须更改当前的实现。

要在不可变数据结构上进行并行,请考虑字符串:如果对字符串调用 reverse 方法,它不会导致同一实例反向出现,而是创建一个反向的新字符串。

scala> val s = "hello, world"
s: String = hello, world
scala> val r = s.reverse
r: String = dlrow ,olleh
scala> println(s, r)
(hello, world,dlrow ,olleh)

TweetSet 是一个不可变的集合,acc.incl(elem) 将返回一个新的 TweetSet,并且 acc 将保持不变。

def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = {
  if (p(elem)) {
    right.filterAcc(p, left.filterAcc(p, acc.incl(elem)))
  } else {
    right.filterAcc(p, left.filterAcc(p, acc))
  }
}
def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = {
    right.filterAcc(p, left.filterAcc(p, if (p(elem)) acc.incl(elem) else acc))
}

最新更新