On Thu, Sep 10, 2009 at 6:34 AM, Peter Verswyvelen <bugf...@gmail.com> wrote:
> You might want to watch out for multithreading issues, although in
> this case, I don't think it will cause sever problems, besides a
> couple of redundant cache updates.
>
>
> On Thu, Sep 10, 2009 at 2:07 PM, Bulat Ziganshin
> <bulat.zigans...@gmail.com> wrote:
>> Hello staafmeister,
>>
>> Thursday, September 10, 2009, 3:54:34 PM, you wrote:
>>
>>> What do you think about such a function? This function is
>>
>> a bit of refactoring
>>
>> -- "global variable" in haskell way
>> cache = unsafePerformIO $ newIORef M.empty

Watch out!  This is not necessarily the same.  The cache in the
original message was one per function, not one globally, because the
let occurred inside a lambda binding.

However, because the body of cache didn't depend on f, we can use
lambda calculus rules to lift the let outside the lambda.  So your
transformation is completely valid...  And yet, the original code
works, and Bulat's equivalent code does not (in fact you can make a
segfault using it).

I wouldn't dare say the original code is "correct" though, since a
valid transformation can break it.  Compilers do valid
transformations.

O unsafePerformIO, how I love thee...

Luke

>>
>> memo f x = unsafePerformIO$ do
>>                       m <- readIORef cache
>>                       case M.lookup x m of
>>                         Just y -> return y
>>                         Nothing -> do let res = f x
>>                                       writeIORef cache $ M.insert x res m
>>                                       return res
>>
>> memo2 = curry . memo . uncurry
>>
>>
>> --
>> Best regards,
>>  Bulat                            mailto:bulat.zigans...@gmail.com
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe@haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to