【问题标题】:How to case match a View in scala如何在scala中匹配视图
【发布时间】:2016-05-09 09:57:35
【问题描述】:

我正在实现一个类来限制对可迭代对象的访问。序列的中间步骤(在一些地图等之后)预计对于内存来说太大了。因此 map(以及类似的东西:scanLeft、reduce、...)应该是惰性的。

在内部我使用map(...) = iterable.view.map( ... )。但似乎IterableView.view 不是它自己,它在多次调用 map 时会产生无用的重定向。这可能并不重要,但我想调用.view 仅当可迭代对象还不是视图时。

那么,如何对视图进行大小写匹配?

class LazyIterable[A](iterable: Iterable[A]){

  def map[B](f: A => B) = {
    val mapped = iterable match {
      case v: View[A] => v              // what should be here?
      case i: Iterable[A] => i.view
    }.map( f ))

    new LazyIterable(mapped)
  }

  def compute() =  iterable.toList

}

请注意,我不知道输入的 Iterable 是什么,具体的 Seq(例如 List、Vector)或 View。如果是视图,我不知道具体的 seq 类型(例如 InterableView、SeqView、...)。我迷失在 View 和 ViewLike 的类层次结构中。

【问题讨论】:

  • view 在这里不是一个合适的标签(它指的是数据库的东西)。我应该为转换后的具体数据添加什么“虚拟”视图?

标签: scala view pattern-matching


【解决方案1】:

v: IterableView[A,_] 可能就是你要找的……

但我认为您一开始就不需要这些。

我根本不明白拥有这个包装能给你带来什么。写作有什么好处

new LazyIterable(myThing).map(myFunc).compute

吃饱了

myThing.view.map(myFunc).toList

【讨论】:

  • 所以IterableView[A,_]是所有视图类型的父类和Iterable[A]的子类?
  • 请注意 LazyIterable 的用处:确实这几乎没有用,但我在这里尽可能简化了我的问题。实际上,我正在处理的课程是管理其他事情,例如排序键,并且可以通过多种方式构建。它是一个相当中心的数据结构。到处传递Seq[...](是否是视图)不够安全和明确。
  • 然后“到处”传递视图。它们是视图,因此根据您的定义,它必须是“安全和明确的”,不是吗? ;)
  • 更好的是,忘记视图,使用迭代器。现在,that 实际上 显式的。
  • 好吧,我想我说得还不够... :-\ View 可能足够安全,但是,整个“扁平”类型应该类似于IterableView[(A,B)] Seq[A] 所在的位置整个系统固有的,B 可能又长又复杂,并且会通过 map op 改变。这并不明确。此外,它们是与这种类型相关的特殊方法,可以附加到它上面:一个简单的例子是 zip 与另一个这样的IterableView[(A,C]) 共享相同的 Seq[A]。最后,我们可能希望有一天更改为实现,但不太可能/经常更改 API
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多