[Haskell-cafe] Trouble with the ST monad

Ross Mellgren rmm-haskell at z.odi.ac
Mon Dec 29 15:54:45 EST 2008


On Dec 29, 2008, at 3:43 PM, Andre Nathan wrote:
> On Mon, 2008-12-29 at 14:19 -0500, Ross Mellgren wrote:
>> The problem is that you're trying to take a STMatrix from some other
>> ST computation and freeze it in a new ST computation. The isolation
>> between separate computations is done via the rank-2 type variable  
>> "s"
>> in all those ST functions.
>
> I guess I should go and read the rank-n types page on the wiki...
>
>> Try this:
>>
>> freezeMatrix :: (forall s . STMatrix s a) -> Matrix a
>> freezeMatrix f :: runST (freezeMatrix f)
>
> Do you know why point-free style doesn't work here even with the type
> annotation?

I'm not very good with all the type-theoretic principles involved, but  
I think it's because higher ranked types cannot unify with lower  
ranked ones. I'm sure some of the more wizardly types could explain  
this with an example of how doing it like that would make something  
that should be illegal possible and the actual principles involved.

(That's longhand for "it makes a kind of intuitive sense to me but I  
can't explain it")

>> Also, instead of using an array of arrays, maybe an array with (Int,
>> Int) as the Ix might be a bit smoother?
>
> Thanks for the suggestion. It didn't occur to me that there was an Ix
> instance for that.
>
> Best,
> Andre
>

-Ross




More information about the Haskell-Cafe mailing list