ひどいタイトルについては申し訳ありませんが、より良いタイトルはわかりません。これが私の問題の大まかな単純化です(それが非常に些細なことのように思われる場合は申し訳ありませんが、それは無意味です):
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
が同じソースからのものであると想定)
ありがとう!