Přehled některých knihoven Haskellu
Indexování
pro typy použitelné pro indexaci polí je určena třída
Ix i
, která odpovídá izomorfnosti se souvislým úsekem celých čísel:class (Ord i) => Ix i where range :: (i,i) -> [i] index :: (i,i) -> i -> Int inRange :: (i,i) -> i -> Bool rangeSize :: (i,i) -> Int
- třída má instance pro celočíselné typy,
Bool
,Char
a k-tice prvků zIx
instanci
Ix
lze získat automaticky pomocíderiving
pokud je typ enumerace (všechny konstruktory jsou nulární) nebo má jen jeden konstruktor parametrizovaný prvkyIx
Funkcionální pole
- jsou neměnná, ale indexovatelná v O(1)
- patří do třídy
IArray
, níže je vždy vynechán kontext(Ix i, IArray a e) =>
vytvoření z hranic indexů a buď seznamu (index,hodnota) nebo rovnou seznamu hodnot:
array :: (i, i) -> [(i, e)] -> a i e listArray :: (i, i) -> [e] -> a i e
vytvoření s akumulační funkcí:
accumArray :: (e -> e' -> e) -- ^ funkce kombinujici prvky na pozici -> e -- ^ implicitni obsah kazde pozice -> (i, i) -- ^ hranice -> [(i, e')] -- ^ seznam asociací -> a i e -- ^ výsledné pole
další užitečné funkce:
(!) :: a i e -> i -> e bounds :: a i e -> (i, i) indices :: a i e -> [i] elems :: a i e -> [e] assocs :: a i e -> [(i, e)]
modifikace (vytvoření změněné kopie) – standardně nebo s akumulací:
(//) :: a i e -> [(i, e)] -> a i e accum :: (e -> e' -> e) -> a i e -> [(i, e')] -> a i e
mapování změnou prvků pole nebo přeuspořádáním indexů:
amap :: (e' -> e) -> a i e' -> a i e ixmap :: (i, i) -> (i -> j) -> a j e -> a i e
- implementace s různou boxovaností prvků pole:
Array i e
je standardní pole s línými (boxovanými) hodnotami – lze v něm mít rekurzivní závislostiUArray i e
je striktní pole - vyšší efektivita
Jiné typy polí
- imperativní pole – třída
class (Monad m) => MArray a e m
– umožňují klasickou práci s polem, ale všechny operace musí být prováděny v monádě (typickyIO
neboST
, tedy poleIO
(U
)Array
neboST
(U
)Array
) - rozdílová pole
Diff
(U
)Array
:- používají funkcionální interface
IArray
- uvnitř využívají monadická pole pro rychlé změny
- přístup a modifikace poslední verze v O(1) (funkcionálně!)
- starší verze mají pomalejší přístup (průchod seznamu změn od nové verze) a při modifikaci je celé pole překopírováno (transparentně)
- lze použít
pole // []
pro jistotu rychlého přístupu - udělá kopii pokud by byl přístup kpole
nepřímý
- používají funkcionální interface