I try to thaw an array of unboxed arrays to the IO monad
Hallo everybody! A few years ago I wrote a program wich contained (among much else) the following:
import IOExts (thawIOArray,freezeIOArray) -- had to be replaced, because ghc doesn't find it anymore import Data.Array.Unboxed as UA (UArray,listArray) import Data.Array.IArray as IA (Array,listArray)
main :: IO () main = do let sL = [1,4,6,3,2,5] dim = length sL help :: [FlatVector] help = [listFlatVector (1,s) [0|i<-[1..s]]|s<-sL] tmp :: Vector FlatVector tmp = listVector (1,dim) help v <- thawIOArray tmp -- lots of stuff res <- freezeIOArray v return ()
type FlatVector = UArray Int Double
listFlatVector :: (Int,Int) -> [Double] -> FlatVector listFlatVector = UA.listArray
type Vector a = Array Int a
listVector :: (Int,Int) -> [a] -> Vector a listVector = IA.listArray
which worked. Now GHC doesn't know IOExts anymore and even doesn't know "thawIOArray" and "freezeIOArray". (At least I could not find it anymore.) So I tried the following:
import Data.Array.Base (thaw,freeze) import Data.Array.Unboxed as UA (UArray,listArray) import Data.Array.IArray as IA (Array,listArray)
main :: IO () main = do let sL = [1,4,6,3,2,5] dim = length sL help :: [FlatVector] help = [listFlatVector (1,s) [0|i<-[1..s]]|s<-sL] tmp :: Vector FlatVector tmp = listVector (1,dim) help v <- thaw tmp -- lots of stuff -- res <- freeze v return ()
type FlatVector = UArray Int Double
listFlatVector :: (Int,Int) -> [Double] -> FlatVector listFlatVector = UA.listArray
type Vector a = Array Int a
listVector :: (Int,Int) -> [a] -> Vector a listVector = IA.listArray
Which yields the following error in Hugs: ERROR "E:\Inf-Sys\NormalerCode\mini-thaw.hs":6 - Cannot justify constraints in explicitly typed binding *** Expression : main *** Type : IO () *** Given context : () *** Constraints : MArray a (UArray Int Double) IO And this one in GHC: mini-thaw.hs:12: No instance for (Data.Array.Base.MArray b FlatVector IO) arising from use of `thaw' at mini-thaw.hs:12 In a 'do' expression: v <- thaw tmp In the definition of `main': main = do let sL = [1, 4, 6, 3, 2, 5] dim = length sL help :: [FlatVector] help = [... | s <- ...] tmp :: Vector FlatVector tmp = listVector (1, dim) help v <- thaw tmp return () I'm a bit disturbed because I could not find a way to solve this. And to make an Array of Arrays (the inner ones unboxed if possible*) mutable should not be thatch a big problem. Any solutions available? I would be glad for any hint. Thanks, Andreas * At that time only GHC provided unboxed Arrays.
participants (1)
-
Andreas Marth