Ixtypeclassは、typeの値から。の値iへの注入のみを必要としますInt。indexと一緒にrange逆マッピングを与えることができます:
index' :: (Ix i) => (i, i) -> Int -> i
index' b x = range b ! x
ご覧のとおりindex'、少なくとも線形時間で評価されます。また、どのくらいの期間機能するかを知ることもできませんrange b。これは、ユーザーがインスタンス定義で定義した方法で評価されます。index'したがって、あなたの場合に必要な最適化(配列の中点を取得)は、一定時間で機能するようなものがある場合にのみ実行できます。typeclassはからへのIx一定の時間マッピングを提供しないので、ユーザーにそれを求める必要があります。次のコードを検討してください。Inti
midpoint :: (Ix j) => (Int -> j) -> Array j e -> e
midpoint f a = a ! f middle
where middle = rangeSize (bounds a) `div` 2
現在、配列の中点を取ることの複雑さは、ユーザー定義の複雑さに依存しますf。したがって、インデックスタイプの値を値iから一定時間で評価できInt、その逆も可能である場合、一定時間で中点を取得します。
ixmapからの関数も考慮してData.Ixください:
ixmap :: (Ix i, Ix j) => (i, i) -> (i -> j) -> Array j e -> Array i e