我尝试在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
这一切都非常直截了当,直到我尝试以这样的方式构建它,即它可以实现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)))
我已阅读有关Builders,CanBuildFrom
和Scala 2.8集合API的文档,但我对如何在此特定应用程序中使用这些模式感到茫然。具体来说,我需要以这样的方式构建它
- "集合" 是引用透明的
map
和filter
等方法将返回MappedRange
或其各个子类的新实例Traversable
方法的大多数都可以实现,可能使用map