实现Scala数据结构以模拟采集

实现Scala数据结构以模拟采集,scala,data-structures,collections,functional-programming,Scala,Data Structures,Collections,Functional Programming,我试图在Scala中构建一个数据结构,它通过提供一个与一个值范围相对应的有序序列、一个基本状态和一个映射器函数来模拟一个集合,该映射器函数将在该范围内的给定值下计算所需的结果 基本结构应如下所示: class MappedRange[A,B,T](rng: IndexedSeq[T], z: A)(mapper: (T, A) => B) { private val cache = new mutable.HashMap[T, B] def apply(t: T): Op

我试图在Scala中构建一个数据结构,它通过提供一个与一个值范围相对应的有序序列、一个基本状态和一个映射器函数来模拟一个集合,该映射器函数将在该范围内的给定值下计算所需的结果

基本结构应如下所示:

class MappedRange[A,B,T](rng: IndexedSeq[T], z: A)(mapper: (T, A) => B) {
    private val cache = new mutable.HashMap[T, B]

    def apply(t: T): Option[B] = 
        if rng.contains(t) Some(cache.getOrElseUpdate(t, mapper(t, z)))
        else None
}
val mapped = new MappedRange((1 to 100), ("a", "b"))
    ((i, z) => if (i % 2 == 0) z._1 else z._2 + i)

// mapped(5) => Some("b5")
// mapped(10) => Some("a")
// mapped(101) => None
如果可能的(人为的)用例是这样的:

class MappedRange[A,B,T](rng: IndexedSeq[T], z: A)(mapper: (T, A) => B) {
    private val cache = new mutable.HashMap[T, B]

    def apply(t: T): Option[B] = 
        if rng.contains(t) Some(cache.getOrElseUpdate(t, mapper(t, z)))
        else None
}
val mapped = new MappedRange((1 to 100), ("a", "b"))
    ((i, z) => if (i % 2 == 0) z._1 else z._2 + i)

// mapped(5) => Some("b5")
// mapped(10) => Some("a")
// mapped(101) => None
这是非常简单的,直到我尝试以这样的方式构建它,它可以实现在
Traversable
map
上定义的许多方法。一个简单的实现将产生如下结果:

val fn = (i, z) => if (i % 2 == 0) z._1 else z._2 + i 
val mapped = new MappedRange((1 to 100), ("a", "b"))(f)

val g = _.toVector
mapped.map(g) 
// => new MappedRange(mapped.rng, mapped.base)((i, z) => g(f(i, z)))
我已经阅读了有关构建器、
CanBuildFrom
和Scala 2.8 collections API的文档,但是我不知道如何在这个特定的应用程序中使用这些模式。具体来说,我需要以这样一种方式构建它

  • “集合”是引用透明的
  • map
    filter
    这样的方法将返回
    MappedRange
    或其各种子类的新实例
  • 大多数
    Traversable
    方法都是可以实现的,很可能使用
    map