On Wed, Mar 27, 2002 at 03:58:46PM +0000, Malcolm Wallace wrote:
José Romildo Malaquias <romildo@uber.com.br> writes:
I would like to use muttable arrays in Haskell 98, with the GHC _and_ NHC98 compilers. By muttable arrays I mean arrays with in-place updates, as with the MArray arrays (which are not Haskell 98 conformant) found in GHC. Is such array implmentation available?
Both compilers have libraries supporting the `IOArray' type, implemented with in-place update, although obviously the operations must be threaded through the IO monad.
module IOExtras -- called IOExts in ghc ( ... , IOArray -- data IOArray ix elt -- mutable arrays , newIOArray -- :: Ix ix => (ix,ix) -> elt -> IO (IOArray ix elt) , boundsIOArray -- :: Ix ix => IOArray ix elt -> (ix, ix) , readIOArray -- :: Ix ix => IOArray ix elt -> ix -> IO elt , writeIOArray -- :: Ix ix => IOArray ix elt -> ix -> elt -> IO () , freezeIOArray -- :: Ix ix => IOArray ix elt -> IO (Array ix elt)
, module Ix -- re-export Ix for the benefit of IOArrays -- instance Eq (IOArray ix elt) )
I am having difficults in defining a map function over an IOArray object. My attempt was mapIOArray :: Ix ix => (a -> b) -> IOArray ix a -> IO (IOArray ix b) mapIOArray f v = do w <- newIOArray bounds ???????????? mapping w (range bounds) where bounds = boundsIOArray v mapping w (i:is) = do x <- readIOArray v i writeIOArray w i (f x) mapping w is mapping w [] = return w But I do not know what to use to replace the ????????????. Is there a polymorphic value in Haskell that can be of any type? Is it indeed possible to have such function without resorting to another intermediate data structure (like a list)? Regards, Romildo -- Prof. José Romildo Malaquias Departamento de Computação http://iceb.ufop.br/~romildo Universidade Federal de Ouro Preto romildo@iceb.ufop.br Brasil romildo@uber.com.br