
Hi, I’m currently playing with the mutable array to implement an heap sort sort (from The Art of Computer Programming) and I’m puzzled with an error. When I code: toHeap :: Ord a => [a] -> IO [a] toHeap [] = return [] toHeap [x] = return [x] toHeap xs = do arr <- newListArray (1, length xs) xs :: IO (IOArray Int a) getElems arr I’ve got this error: Could not deduce (a ~ a1) from the context (Ord a) bound by the type signature for toHeap :: Ord a => [a] -> IO [a] at /var/folders/fk/339860r16j759wmsfmjkyr4h0000gn/T/flycheck797T5s/Heapsort.hs:9:11-32 ‘a’ is a rigid type variable bound by the type signature for toHeap :: Ord a => [a] -> IO [a] at /var/folders/fk/339860r16j759wmsfmjkyr4h0000gn/T/flycheck797T5s/Heapsort.hs:9:11 ‘a1’ is a rigid type variable bound by an expression type signature: IO (IOArray Int a1) at /var/folders/fk/339860r16j759wmsfmjkyr4h0000gn/T/flycheck797T5s/Heapsort.hs:14:10 Expected type: [a1] Actual type: [a] Relevant bindings include xs :: [a] (bound at /var/folders/fk/339860r16j759wmsfmjkyr4h0000gn/T/flycheck797T5s/Heapsort.hs:12:8) toHeap :: [a] -> IO [a] (bound at /var/folders/fk/339860r16j759wmsfmjkyr4h0000gn/T/flycheck797T5s/Heapsort.hs:10:1) In the second argument of ‘newListArray’, namely ‘xs’ In a stmt of a 'do' block: arr <- newListArray (1, length xs) xs :: IO (IOArray Int a) But with the code below, all work: toHeap :: Ord a => [a] -> IO [a] toHeap [] = return [] toHeap [x] = return [x] toHeap xs = do arr <- buildArray xs getElems arr buildArray :: [a] -> IO (IOArray Int a) buildArray xs = newListArray (1, length xs) xs What do I miss ? Thanks. Chris