
On Sun, Apr 12, 2015 at 12:41 PM, Christian Sperandio < christian.sperandio@gmail.com> wrote:
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
Note that the "a" in the signature "IO (IOArray Int a)" is *not* the same as the one in the signature of toHeap; the scope of that type variable is the signature itself, not the following equation(s). You have in effect done the opposite of what you intended --- instead of asserting it is the same, you asserted that it is a *different* one, by handing the compiler an unexpected `a` which must be assumed to represent a distinct type. If you need to extend the scope of a type variable like this, you need the ScopedTypeVariables extension, and to declare the type variable as having extended scope with an explicit `forall`: {-# LANGUAGE ScopedTypeVariables #-} toHeap :: forall a. 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 -- brandon s allbery kf8nh sine nomine associates allbery.b@gmail.com ballbery@sinenomine.net unix, openafs, kerberos, infrastructure, xmonad http://sinenomine.net