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,Chara k-tice prvků zIx instanci
Ixlze získat automaticky pomocíderivingpokud 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 evytvoř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é poledalší 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 emapová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 eje standardní pole s línými (boxovanými) hodnotami – lze v něm mít rekurzivní závislostiUArray i eje 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ě (typickyIOneboST, tedy poleIO(U)ArrayneboST(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 kpolenepřímý
- používají funkcionální interface