5

IOArrayから、またはMArray一般的にスライス (サブ配列ビュー) を効率的に構築する方法はありますか? つまり、境界を制限するだけで、同じ配列を取得します。署名は

(MArray a e m, Ix i) => a i e -> i -> i -> m (a i e)

たとえば、境界を持つ配列を取得し、元の配列の(1,1000)境界を持つ要素にのみアクセスできるビューを作成します(500,700)。ドキュメントを検索しましたが、そのような機能は見つかりませんでした。

4

1 に答える 1

5

配列型がどのように実装されているかを考えると、これは実際に配列の機能となるものではありません。おそらく、これらの線に沿ったものがまだ存在しないのはそのためです。

配列はメモリの連続したブロックであることを思い出してください。したがって、あるレベルでは、n要素を持つすべての配列に境界があります(0, n-1)。しかし、ゼロから始まる整数以外のインデックスを望むことは十分に一般的であり、Haskell は任意の境界を定義し、それらの境界内の要素から実際のメモリ ブロックの 0 ベースの整数インデックスに変換するための型クラスを提供します。

これは、配列の境界がその範囲全体をカバーしていると想定されるため、やりたいことを行うのに多少の困難を引き起こします。したがって、同じメモリ チャンクを使用するが境界が異なる既存の配列のコピーを単純に作成する場合、インデックスは整列しません。この例では、サブ配列のインデックス 500 は元のインデックス 1 と同じになります。配列。役に立ちません。

ここでの最も簡単なアプローチは、既存の配列をラップし、インデックスの変換に必要な追加情報を格納する独自の配列型を定義して、独自の境界をより小さい範囲として報告するが、フルレンジ。次に、「実際の」配列と同じ境界を使用するだけで、新しく作成された配列で、ラップされた配列型をどこでも使用できます (そして、期待されるすべてのインスタンスを指定します &c.)。ここでは、インデックスに対して必要な変換を実行できるため、このアプローチは、線形順序を持たないインデックス タイプにも一般化する必要があります (たとえば、タプルによってインデックス付けされた「多次元」配列)。

おそらく、インデックス型の周りにラッパーを巻き込み、ラッパーのバージョンに何かをIx自動的に変換する奇妙なインスタンスを与えることで、既存の配列型を使用できるようにすることもできます。ただし、それを正しく機能させるのはおそらく難しいでしょう。

配列またはインデックスのタイプを変更せずにそれを行う方法はないと思います。

于 2013-01-13T19:13:45.597 に答える