
Ron de Bruijn
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 correct.
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 your questions.
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 operation)?
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 putBoundVariableToSomeOtherFunctionThatDoesMonadicOperations (restOfPureFunctionalProgramForExample x)
No.
So it's not possible to write some function that does the following:
f::Int 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.) <snip> Jon Cast