Fast Mutable arrays and a general question about IO
Thu, 01 May 2003 14:32:52 -0500
Ron de Bruijn <email@example.com> wrote:
> Hi there,
> I have been busy for a couple of days now, to just get a bit more
> feeling on Haskell and I have read a bunch of tutorials, also about
> Monads and experimented of course. And now I want to use it for my
> real world problem. I think I understand the languageprinciples good
> enough, but I yet don't understand the syntax of all of the
> functioninterfaces. And that's my problem.
> I want to create the fastest array as possible in Haskell
Why? It's not always necessary to go for maximum speed; do you have a
reason for needing it in this case?
> and I understood that I should use this function(the function below
> that creates a mutable array). The only problem is that I don't kwow
> how to use it.
> Constructing mutable arrays
> newArray :: (MArray a e m, Ix i) => (i, i) -> e -> m (a i e)
> Builds a new array, with every element initialised to undefined.
No; that's newArray_. (newArray bounds x) builds an array with every
element initialized to x.
> Reading and writing mutable arrays
> readArray :: (MArray a e m, Ix i) => a i e -> i -> m e
> Read an element from a mutable array
> writeArray :: (MArray a e m, Ix i) => a i e -> i -> e -> m ()
> Write an element in a mutable array
> I see it takes two arguments: a tuple of an index type (I use Int, so
> for example (0,1) 0 for the lower bound, 1 for the upper bound.),
I assume you're talking about newArray here, right? If so, you're
> but the e (according to "GHC documentation" it says the "element
> type"). Well the type of my elements should be my own datatype
> myDataType, but I can't even get it done to create simple mutable
> array's of Int or Bool.
> How can I make it work with my own datatype myDataType (could you give
> some examples for the use of the below functions?)?
I think you mean `above'. In any case, could you show us some code you
have that's not working? That'll make it much easier for us to answer
> Is it OK to say that in Haskell any value that is put from an extern
> source of the program (reading a file, reading stdin etc.) to a really
> pure function, must be in a do notation (essentially being a Monadic
Yes. More specifically, they don't need to use do-notation (although if
you don't know why not, don't worry about it), but they do have to be
monadic. Specifically, they have to use the IO monad.
> So to put it more concrete: In any Haskell program that does IO there
> is always some function that has this form:
> do x<-someSource
> (restOfPureFunctionalProgramForExample x)
> So it's not possible to write some function that does the following:
> f do x<-getChar --suppose the Char is a number
> someSpecialReturnFunction x
> and than the result of the IO is only Int after some alterations of
> above code.
Correct. (I don't think this is a big issue; a Haskell program is
required to execute in terms of a value `main' in the IO monad.)