Ix
typeclass僅要求從i
類型的值注入到Int
的值。 index
與range
在一起可以給我們逆映射:
index' :: (Ix i) => (i, i) -> Int -> i
index' b x = range b ! x
正如你可以看到index'
線性時間至少評估。我們也無法知道range b
的工作時間。它以用戶在實例定義中定義的方式進行評估。所以在你的情況下需要優化(獲得一個數組的中點)可以發生當且僅當我們有某種類型的恆定時間工作的index'
。由於Ix
typeclass沒有給我們提供從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
如果真的存在一個雙射,那麼爲什麼不映射到整數,計算中點,然後採取逆映射回它的索引類型?我不知道什麼樣的機制會允許Haskell這樣做,但似乎有可能? – Gian 2010-09-08 14:28:24
「Ix」類中的函數'index'是bijection的一部分,將索引映射到整數,但另一個缺失,據我所知。 – yatima2975 2010-09-08 14:51:13