-- A rectangular subarray
subarray :: (Ix a) => (a,a) -> array a b -> array a b
subarray bnds = ixmap bnds (\i->i)
-- A row of a matrix
row :: (Ix a, Ix b) => a -> array (a,b) c -> array b c
row i x = ixmap (l',u') (\j->(i,j)) x where ((_,l'),(_,u')) = bounds x
-- Diagonal of a matrix (assumed to be square)
diag :: (Ix a) => array (a,a) b -> array a b
diag x = ixmap (l,u) (\i->(i,i)) x
where
((l,_),(u,_)) = bounds x
-- Projection of first components of an array of pairs
firstarray :: (Ix a) => array a (b,c) -> array a b
firstarray = fmap (\(x,y)->x)