ここのトレイルはあまりにも複雑であいまいです。要素を削除することでこれを見ることができます。特に、最後の添字ドロップ:この構成では
let z = [0, 1, 2].lazy.drop(while: {_ in false}).prefix(2)
を、コンパイラはLazyPrefixCollection<LazyDropWhileBidirectionalCollection<[Int]>>
としてz
を入力したいと考えています。しかし、これは整数では索引付けできません。
私はそれがそうであるように感じますが、現在のコンパイラでは証明できません。
(下記参照)[0]
が失敗します。バックトラックはこの狂った迷路から抜け出すほど強力ではありません。異なる戻り値の型を持つオーバーロードが多すぎるため、コンパイラは必要なものを知りません。
は、しかし、この特定のケースは自明固定されている:言わ
print([0, 1, 2].lazy.drop(while: {_ in false}).prefix(2).first!)
は、私は絶対にコンパイラにこのハードを押して避けるだろう。今日はスウィフトのためにこれはすべて賢明です。特に、さまざまなタイプを返すオーバーロードは、Swiftの非常に悪い考えです。彼らがシンプルなとき、はい、あなたはそれを手放すことができます。しかし、レイヤーを開始すると、コンパイラーはそれを解決するための十分な堅牢なエンジンを持っていません。 (私たちは十分な長さ、私はそれが実際に何らかの形で曖昧で賭けているこれを研究している場合それは、言っていますが、過度に賢いスウィフトに入る際に誤解された診断は。それは非常に一般的な状況です。)今
それを(コメントの中で)記述すると、推論は簡単です。
LazyDropWhileCollection
は整数のインデックスを持つことができません。索引添字はO(1)である必要があります。それはIndex
サブスクリプトと他のサブスクリプトの意味です。 (Index
サブスクリプトもタイプを返すか、クラッシュする必要があります。Element?
を返すことはできません。それはDictionaryIndex
がKey
とは別のものです)
コレクションが遅延していて、不足している要素が任意であるため、特定の整数「カウント」(第1、第2など)を検索するとO(n) 。少なくとも100要素を通らずに100番目の要素が何であるかを知ることはできません。コレクションであるためには、そのO(1)インデックスは、以前にシーケンスを歩いたことによってのみ作成できる形式でなければなりません。 Int
にはできません。
あなたのようなコードを書くときので、これは重要です:
for i in 1...1000 { print(xs[i]) }
あなたはそれが1000年のオーダーであることを期待する「手順、」このコレクションは整数のインデックスを持っていたならば、それは順番になります100万歩のインデックスをラップすることで、最初にそのコードを書くことができなくなります。
これは、Swiftのような非常に一般的な言語では、汎用アルゴリズムのレイヤーが予期せぬO(n)操作を完全に実行不可能なパフォーマンスに簡単にカスケードすることができる場合に特に重要です(「実行不可能」とは、分以上)。
コンパイラの出力に、「レイジー」の候補が2つあります。 –
関連する「問題コード」を投稿してください。 – shallowThought
@shallowThought関連する問題コードは、最初の文のリンクの最後の行です。上記の投稿に追加しました。 –