# [Haskell-cafe] Implementing and indexing 2 dimen arrays

Alex Gontcharov alexg005 at hotmail.com
Fri Mar 26 03:34:23 EST 2004

```I am writing a function, It's my first Haskell program
in output function
I will be working on [[3,4],[1,2,3,2],[3,9,9,4],[8,3,3,4] type
structures
I'd like to know how to index a particular element at run-time
as I don't know on which element of which sublist I am at the moment
in pullHelper function which starts with values !! ind p xs !!

in C it would look something like

values[][10]={{....}.{....}..};
int index[4]={3,4,6,7};
int i; i
for(i = 0; i<4; i++) {
int c = index[i];
if(values[i][c-1] == 0)
/* do something */
else
/*other things*/
}
Any help would be appreciated

--Stack for the digits of numbers, a modulo b,
stack :: Int->Int->[[Int]]
stack x y  = reverse (split (subStack x y))
where
--Split the digits further and constructs lists of lists
split :: [Int]->[[Int]]
split xs
| length xs == 0 = []
| otherwise = (reverse (subStack (head xs) 10)):
(split (tail xs))
subStack :: Int->Int->[Int]
subStack x y
| x == 0 = []
| otherwise = (mod x y):(subStack (div x y) y)

-- It should work for 999999999 range but since I am using
-- Int maximum is 2^31-1
output :: Int->[Char]
output n  = loop (stack n 10000)
where
-- goes through sets of at most 4 digits in the list, loop
loop :: [[Int]]->[Char]
loop xs
| length xs == 0 = []
| otherwise = (strCon (head xs)) : (loop (tail xs))

strCon :: [Int]->[Char]
strCon xs
| length xs == 0 = []
| otherwise = (pullStr (head xs)) : (strCon (tail xs))

pullStr :: Int->[Char]
pullStr s
| s == 0 = []
| otherwise = pullHelper s
--Helping to pull elements from the set, nested if
pullHelper :: Int->[Char]
pullHelper p
| values !! ind p xs !! p - 1 == 0 =
ones !! p - 1 ++ values !! ind p xs !! 0
| otherwise = values !! ind p xs !! p - 1
--Nasty !

```