[Haskell-cafe] Computing lazy and strict list operations at the same time

jerzy.karczmarczuk at info.unicaen.fr jerzy.karczmarczuk at info.unicaen.fr
Mon Jun 19 13:54:16 EDT 2006


Joel Reymont writes: 

> Where's the solution and what is the repmin problem? 
> 
> On Jun 19, 2006, at 5:21 PM, Jerzy Karczmarczuk wrote: 
> 
>> Such tricks become your second nature, when you take the solution
>> (lazy) of the "repmin" problem by Richard Bird, you put it under your
>> pillow, and sleep for one week with your head close to it.

Well, the Functionalist True Lazy Church considers this to be a part
of the Holy Scriptures... 

R.S. Bird. Using circular programs to eliminate multiple traversals of data. 
Acta Informatica, 21, pp. 239--250, 1984. 

Traverse a binary tree ONCE, and replace all the elements by the minimum
of all leaves (i.e., construct a new tree, topologically equivalent, but
with all leaf nodes being the minimum value within the original source. A
one pass algorithm postpones the binding of an argument until the minimum
is found... 


data Tree a = L a | B (Tree a) (Tree a) 


    rpMin :: (Tree Int, Int) -> (Tree Int, Int)
    rpMin (L a,   m) = (L m, a) 


    rpMin (B l r, m) = let (l', ml) = rpMin (l, m)
                           (r', mr) = rpMin (r, m)
                       in (B l' r', ml `min` mr) 


    replaceMin :: Tree Int -> Tree Int
    replaceMin t = let (t', m) = rpMin (t, m)
                   in t' 

Google, your not-so-humble friend will find you some dozen references...
For example, Levent Erkök:
http://www.cse.ogi.edu/PacSoft/projects/rmb/repMin.html 


Jerzy Karczmarczuk 



More information about the Haskell-Cafe mailing list