抱歉,标题太糟糕了,不确定有更好的标题。这是我的问题的总体简化(抱歉,如果它看起来如此微不足道,那么它毫无意义):
class RList[T](data: List[T]) {
def map[V](f: T=>V): RList[V] = ...
}
的想法RList
(受限列表)的缺点是您无法调整其大小,或更改其中元素的顺序。但是您可以使用函数为您提供一个新的 RList,其中包含更改的数据。
现在需要一个创建 RList 的函数。它可能有签名某物 like:
def toRList[T](values: List[T]): RList[T] = ...
到目前为止,一切都很好。但现在是棘手的部分。我需要一个有效的功能like this:
def zip[T, V](left: RList[T], right: RList[V]): RList[(T,V)]
但还有一个额外的限制left
and right
具有相同的起源。因此,保证它们的大小相同。
例如应该编译的代码:
val x = toRList(List(1, 2, 3))
val y = x.map(_ * 2)
val z = y.map(_.toString)
zip(y,z)
例如应该失败的代码编译
val y = toRList(List(2, 4, 6))
val z = toRList(List("one", "two"))
zip(y,z)
*注意:在我最初的问题中,对 zip 的约束必须是它们来自同一“源”。仅仅保证它们的长度相同是不够的(更不用说,列表的大小在编译时未知)*
我还需要能够使用zip
多次,所以这样的东西应该编译
zip(a,zip(b,c))
(假设a
, b
and c
均来自同一来源)
Thanks!