[Haskell-cafe] for loops and 2d arrays in haskell
Ketil Malde
Ketil.Malde at bccs.uib.no
Fri Jan 19 03:05:32 EST 2007
Fernan Bolando wrote:
> what is the simplest way to implement the following code in haskell?
> it's just printing the contents of 2D array.
>
> for(i = 0; i < imax; i++){
> for(n = 0; n < nmax; n++){
> printf("%i:%i = %f\n", array[i][n]);
> }
> }
*%* ghci
___ ___ _
* / _ \ /\ /\/ __(_)
/ /_\// /_/ / / | | GHC Interactive, version 6.6, for Haskell 98.
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
\____/\/ /_/\____/|_| Type :? for help.
Loading package base ... linking ... done.
Prelude>* :m + Data.Array
*Prelude Data.Array>* let a = listArray ((0,0),(2,2)) [1..9]
This is how it looks by default:
*Prelude Data.Array>* a
array ((0,0),(2,2))
[((0,0),1),((0,1),2),((0,2),3),((1,0),4),((1,1),5),((1,2),6),((2,0),7),((2,1),8),((2,2),9)]
'assocs' builds the corresponding assoc list:
*Prelude Data.Array> *assocs a
[((0,0),1),((0,1),2),((0,2),3),((1,0),4),((1,1),5),((1,2),6),((2,0),7),((2,1),8),((2,2),9)]
'map show' converts it into a list of strings:
*Prelude Data.Array>* map show $ assocs a
["((0,0),1)","((0,1),2)","((0,2),3)","((1,0),4)","((1,1),5)","((1,2),6)","((2,0),7)","((2,1),8)","((2,2),9)"]
'unlines' to convert to a single string where each list element is
one line, and 'putStrLn' to print it:
*Prelude Data.Array> *putStrLn $ unlines $ map show $ assocs a
**((0,0),1)
((0,1),2)
((0,2),3)
((1,0),4)
((1,1),5)
((1,2),6)
((2,0),7)
((2,1),8)
((2,2),9)
*
*To get the exact same output, replace 'show' with a custom-built
function.
*
Prelude Data.Array>* putStrLn $ unlines $ map (\((i,j),v)-> show
i++":"++show j++"="++show v) $ assocs a
0:0=1
0:1=2
0:2=3
1:0=4
1:1=5
1:2=6
2:0=7
2:1=8
2:2=9
More information about the Haskell-Cafe
mailing list