
Xuan Luo wrote:
I am having lots of trouble using polymorphic mutable IOArrays. Here is an example program:
import Data.Array.MArray import Data.Array.IO
foo x = do a <- newArray (0, 4) x readArray a 2
main = foo 42 >>= print
So there is a function "foo" which makes an array of polymorphic type initialized with a value, then returns one of the elements of the array.
Note that there are no arrays with "polymorphic element type", it's rather that your foo can be used to create an array with elements the same type as x . So, if x is an integer, foo creates an array with integer elements etc.
What the heck is this? I looked through a lot of stuff online and eventually found that this works:
{-# LANGUAGE ScopedTypeVariables #-} import Data.Array.MArray import Data.Array.IO
foo :: forall a. a -> IO a foo x = do a <- newArray (0, 4) x :: IO (IOArray Int a) readArray a 2
main = foo 42 >>= print
So I had to add some weird "forall" stuff to my function signature and enable some language extension flag(?). This seems way too complicated.
The forall is not weird :). In fact, the type signature foo :: a -> IO a should be seen as an abbreviation for foo :: forall a. a -> IO a See also http://en.wikibooks.org/wiki/Haskell/Polymorphism Here, the forall a introduces a as type variable so that IOArray Int a refers to the same type a . You need an extension for that because for some odd reason, Haskell98 offers no way to do that; it will likely be included in the next version of the Haskell language. Regards, apfelmus