Bulat Ziganshin wrote:
Hello Simon,

Monday, February 06, 2006, 4:41:50 PM, you wrote:

SM> The Var class is interesting - basically the equivalent of the MArray
SM> class for mutable variables. Is there a reason you couldn't use the SM> same pattern as the MArray class? MArray of Ptr works fine, but for SM> some reason you couldn't do it with Var, why not?

quick answer: because it don't use fundeps:

class (HasBounds a, Monad m) => MArray a e m where
vs
class (Monad m) => Var m r a | r->a, m a->r where

and fundeps used to avoid needing to specify type of created
reference, as should be done with arrays:

     main = do arr <- newArray (1,10) 37 :: IO (IOArray Int Int)
     main = print $ runST
                       (do arr <- newArray (1,10) 127 :: ST s (STArray s Int 
Int)

while in my library one can write the following code:

          chars  <- newVar (0::Int)
          inWord <- newVar False

Sure, but you're restricted to one kind of Var per monad. With MArray, we have several array types per monad, and we could also have several monads per array type - if, say, you wanted to implement an instance of MArray for IOArray in your own IO-based monad, that's possible. Fewer fundeps = more flexibility but more type annotations.

If we were to have overloaded references in the standard libraries, it would look strange if the interface wasn't consistent with overloaded arrays. I think you could mitigate the problem by providing non-overloaded newIORef/newSTRef operations.

I'd support providing IOURef & STURef types, with overloading similar to MArray (MRef).

btw, i have the counter proposal - automatically convert IORefs of
simple types to the fast internal variables like the Int automatically
converted to the Int#. The same applies to automatic conversion of
arrays to the unboxed arrays

The problem with doing this is you need a pretty beefy strictness analyser to be able to tell whether the reference is being used strictly, this is far beyond what GHC does (I'm impressed that jhc can do this, but I don't think there's much hope for us doing it in GHC).

Better is for the user to request strict references, and have the implementation do the unboxing, which is exactly what happens with IOUArray. Furthermore, it's deterministic: if you ask for an IOUArray (or IOURef), you're guarnanteed to get unboxing, which is better than relying on some complex optimisation to work properly.

Cheers,
        Simon
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to