[Haskell-beginners] Haskell Bin Tree Cellular Automata.

Frerich Raabe raabe at froglogic.com
Sat Jun 6 09:36:25 UTC 2015


On 2015-06-06 06:01, Stefan Höck wrote:
> On Thu, Jun 04, 2015 at 04:31:07PM -0700, Sourabh wrote:
>> Wow, it runs in 0.44 seconds now. This is incredible! Can you explain what
>> just happened here?
> 
> Here is a try at an explanation.

Thank you a lot for taking the time to walk through it! One thing got
me thinking though:

> And now we build a list of integers in a similar fashion to your
> tree-generating function:
> 
>   ints :: Integer -> [Integer]
>   ints i = i : [calc (ints i !! (n-1)) | n <- [1..]]
> 
> Store this in a file, fire up ghci, load the file and enter
> 
>   take 500 $ ints 1

[..]

> Let's add some memoization:
> 
>   ints2 :: Integer -> [Integer]
>   ints2 i = let is = i : [calc (is !! (n-1)) | n <- [1..]]
>             in  is
> 
> Again, load this in ghci and run
> 
>   take 500 $ ints2 1
> 
> Marvel at the difference.

This is what's known as 'Tying the Knot' (e.g. on
https://wiki.haskell.org/Tying_the_Knot), right? I wonder - would it
be possible (and plausible) for a compiler to perform this rewriting
automatically, such that any occurrence of code like

   f x = e

where 'e' involves a call to 'f x' gets replaced with

   f x = let z = e in z

and all occurences of 'f x' in 'e' get replaced with 'z'?

-- 
Frerich Raabe - raabe at froglogic.com
www.froglogic.com - Multi-Platform GUI Testing


More information about the Beginners mailing list