对不起,糟糕的标题,不确定更好的标题。这是对我的问题的粗略简化(对不起,如果它看起来如此微不足道,那毫无意义):
class RList[T](data: List[T]) {
def map[V](f: T=>V): RList[V] = ...
}
(受限列表)的想法RList
是您不能调整它的大小,或更改其中元素的顺序。但是您可以使用为您提供新 RList 的函数,其中包含已更改的数据。
现在需要一个创建 RList 的函数。它可能有一个类似的签名:
def toRList[T](values: List[T]): RList[T] = ...
到目前为止,一切都很好。但现在是棘手的部分。我需要一个像这样工作的函数:
def zip[T, V](left: RList[T], right: RList[V]): RList[(T,V)]
left
但是具有与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
c
谢谢!