Ix
typeclassは、typeの値から。の値i
への注入のみを必要としますInt
。index
と一緒にrange
逆マッピングを与えることができます:
index' :: (Ix i) => (i, i) -> Int -> i
index' b x = range b ! x
ご覧のとおりindex'
、少なくとも線形時間で評価されます。また、どのくらいの期間機能するかを知ることもできませんrange b
。これは、ユーザーがインスタンス定義で定義した方法で評価されます。index'
したがって、あなたの場合に必要な最適化(配列の中点を取得)は、一定時間で機能するようなものがある場合にのみ実行できます。typeclassはからへのIx
一定の時間マッピングを提供しないので、ユーザーにそれを求める必要があります。次のコードを検討してください。Int
i
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