[Haskell-cafe] Question about ST arrays

Jean-Marc Alliot jm at alliot.org
Fri Dec 29 14:36:54 UTC 2017


This is my first post to this list so I apologize in advance if I don't 
use it properly, or if my question is too simple or inapropriate.

I come from the Caml world and I am quite new to Haskell (but not to 
functional programming). I am currently trying to get the hang of 
Haskell arrays. I have gone through regular arrays, IO Arrays and I am 
now working with ST Arrays.

This is the problem I am currently stuck with. I write the following code:

arr = newArray (-1, 1) 0 :: ST s (STArray s Int Int)
get :: Int -> Int
get i = runST (arr >>= (\b -> readArray b i))

Here everything is perfectly OK.

Now I want a more general version that could deal with any array like 
arr. So I write:

get2 :: ST s (STArray s Int Int) -> Int -> Int
get2 tab i = runST (tab >>= (\b -> readArray b i))

And the compiler is clearly very upset by my code:

Couldn't match type ‘s’ with ‘s1’
       ‘s’ is a rigid type variable bound by
         the type signature for:
           get2 :: forall s. ST s (STArray s Int Int) -> Int -> Int
         at testst.hs:17:9
       ‘s1’ is a rigid type variable bound by
         a type expected by the context:
           forall s1. ST s1 Int
         at testst.hs:18:14
       Expected type: ST s1 Int
         Actual type: ST s Int
I am pretty sure that the compiler is right and I am wrong, but I don't 
get why... Anyone could help?


More information about the Haskell-Cafe mailing list