[Haskell-cafe] Space questions about intern and sets
Gracjan Polak
gracjan at acchsh.com
Thu Jun 9 10:38:30 EDT 2005
Udo Stenzel wrote:
> Gracjan Polak wrote:
>
>>>>iorefset :: Ord a => IORef(Map.Map a a)
>>>>iorefset = unsafePerformIO $ do
>>>> newIORef $ Map.empty
>>
>>I could have as many dictionaries as there are types. The problem is I
>>get one dictionary for each object which defeats the idea.
>
>
> I believe the (Ord a) constraint acts like a function argument.
> Therefore iorefset is no CAF, cannot be memoized itself and you get one
> dictionary per invocation. On the other hand, that is what is to be
> expected when playing games with unsafePerformIO.
Seems you are right. Monomorphic type works, polymorphic doesn't. But it
probably is not in any way guaranteed to stay like this in future.
>
> You might get it working by giving iorefset a monomorphic type or by
> specializing it for the type(s) you are using it at. Don't forget the
> NOINLINE pragma. I wouldn't do it this way, though. If you're parsing,
> chances are that your code is monadic anyway. Put a StateT over the
> parser monad and everything works without black magic. Even better, if
> you're using parsec you can just put the Map in the user state.
>
This will create intern-per-parse, which isn't bad and has it's
advantages, but I wanted to do something global. Anyway it was
interesting experiment :)
>
> Udo.
--
Gracjan
More information about the Haskell-Cafe
mailing list