caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Lazy recomputing
@ 2004-06-01 10:07 Hans Ole Rafaelsen
  2004-06-01 11:43 ` Thomas Fischbacher
  0 siblings, 1 reply; 5+ messages in thread
From: Hans Ole Rafaelsen @ 2004-06-01 10:07 UTC (permalink / raw)
  To: caml-list

Hi,

I have a hash table which contains values, of which some are dependent on 
other values in the table.  I store the contents as lazy values. The problem 
I'm having is that once a dependent value have been computed, it will not get 
recomputed when the values it depends on changes.

let _ =
  List.iter
    (fun (k,v) -> Hashtbl.add tbl k v)
    [
      ("a", lazy 1);
      ("c", lazy ((Lazy.force (Hashtbl.find tbl "b")) + (Lazy.force 
(Hashtbl.find tbl "a"))));
      ("b", lazy 4);
    ];;

# let _ = Lazy.force (Hashtbl.find tbl "b");;
- : int = 4
# let _ = Lazy.force (Hashtbl.find tbl "c");;
- : int = 5
# let _ = Hashtbl.replace tbl "b" (lazy 6);;
- : unit = ()
# let _ = Lazy.force (Hashtbl.find tbl "b");;
- : int = 6
# let _ = Lazy.force (Hashtbl.find tbl "c");;
- : int = 5
# 

Is there some trick to get it recomputed, other that keep a list of all 
dependent values, and "refresh" the table whenever some value is updated?
From the documentation of Lazy it does not seem that such behavior is 
supported.

-- 
Hans Ole Rafaelsen

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Caml-list] Lazy recomputing
  2004-06-01 10:07 [Caml-list] Lazy recomputing Hans Ole Rafaelsen
@ 2004-06-01 11:43 ` Thomas Fischbacher
  2004-06-01 12:59   ` skaller
  0 siblings, 1 reply; 5+ messages in thread
From: Thomas Fischbacher @ 2004-06-01 11:43 UTC (permalink / raw)
  To: Hans Ole Rafaelsen; +Cc: caml-list


> Is there some trick to get it recomputed, other that keep a list of all 
> dependent values, and "refresh" the table whenever some value is updated?

This is not what the general concept of laziness is about.

You need something different.

-- 
regards,               tf@cip.physik.uni-muenchen.de              (o_
 Thomas Fischbacher -  http://www.cip.physik.uni-muenchen.de/~tf  //\
(lambda (n) ((lambda (p q r) (p p q r)) (lambda (g x y)           V_/_
(if (= x 0) y (g g (- x 1) (* x y)))) n 1))                  (Debian GNU)

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Caml-list] Lazy recomputing
  2004-06-01 11:43 ` Thomas Fischbacher
@ 2004-06-01 12:59   ` skaller
  2004-06-01 15:22     ` Hans Ole Rafaelsen
  0 siblings, 1 reply; 5+ messages in thread
From: skaller @ 2004-06-01 12:59 UTC (permalink / raw)
  To: Thomas Fischbacher; +Cc: Hans Ole Rafaelsen, caml-list

On Tue, 2004-06-01 at 21:43, Thomas Fischbacher wrote:
> > Is there some trick to get it recomputed, other that keep a list of all 
> > dependent values, and "refresh" the table whenever some value is updated?
> 
> This is not what the general concept of laziness is about.
> 
> You need something different.

What he actually needs is a generalisation: a partial evaluator.

In the actual example there is a way to make it work
if you know when you change key X which keys D1, D2, ..
depend on it: you just replace D1, D2 values with
fresh Lazy expressions that aren't yet forced,
next time they're accessed force will cause a recomputation.

I do not know if this is possible in the situation,
nor if the result will be efficient (but it should work :)

I guess Lazy.refresh function might fix this by killing
off the memoised value without having to actually replace
it (and also work in a functional context).

-- 
John Skaller, mailto:skaller@users.sf.net
voice: 061-2-9660-0850, 
snail: PO BOX 401 Glebe NSW 2037 Australia
Checkout the Felix programming language http://felix.sf.net



-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Caml-list] Lazy recomputing
  2004-06-01 12:59   ` skaller
@ 2004-06-01 15:22     ` Hans Ole Rafaelsen
  2004-06-01 17:39       ` skaller
  0 siblings, 1 reply; 5+ messages in thread
From: Hans Ole Rafaelsen @ 2004-06-01 15:22 UTC (permalink / raw)
  To: skaller; +Cc: Thomas Fischbacher, caml-list

On Tuesday 01 June 2004 14:59, skaller wrote:
> On Tue, 2004-06-01 at 21:43, Thomas Fischbacher wrote:
> > > Is there some trick to get it recomputed, other that keep a list of all
> > > dependent values, and "refresh" the table whenever some value is
> > > updated?
> >
> > This is not what the general concept of laziness is about.
> >
> > You need something different.
>
> What he actually needs is a generalisation: a partial evaluator.

Thanks, that got me on the right track.  The values are stored as functions in 
the table.  That way they are not evaluated during initialization, and can be 
forced reevaluated when needed.  Have to make my own access functions.

let _ =
  List.iter
    (fun (k,v) -> Hashtbl.add tbl k v)
    [
      ("a", fun () ->  1);
      ("c", fun () -> ((Hashtbl.find tbl "b") ()) + ((Hashtbl.find tbl "a") 
()));
      ("b", fun () -> 4);
    ]
let find tbl k =
  Hashtbl.find tbl k ()

let replace tbl k v =
  Hashtbl.replace tbl k (fun () -> v)

# let _ = find tbl "c";;
- : int = 5
# let _ = replace tbl "a" 7;;
- : unit = ()
# let _ = find tbl "c";;
- : int = 11
# 

-- 
Hans Ole

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [Caml-list] Lazy recomputing
  2004-06-01 15:22     ` Hans Ole Rafaelsen
@ 2004-06-01 17:39       ` skaller
  0 siblings, 0 replies; 5+ messages in thread
From: skaller @ 2004-06-01 17:39 UTC (permalink / raw)
  To: hans; +Cc: Thomas Fischbacher, caml-list

On Wed, 2004-06-02 at 01:22, Hans Ole Rafaelsen wrote:
> let _ =
>   List.iter
>     (fun (k,v) -> Hashtbl.add tbl k v)
>     [
>       ("a", fun () ->  1);
>       ("c", fun () -> ((Hashtbl.find tbl "b") ()) + ((Hashtbl.find tbl "a") 
> ()));
>       ("b", fun () -> 4);
>     ]

Of course, this will recompute the same result needlessly
to make sure it also computes the new result when needed.
Also the functions are bound to a particular hashtble,
which isn't so nice: might be nicer to write:

 fun tbl -> find tbl "b" + find tbl "a"

and 

let eval tbl key = find tbl key tbl;;
let tbl = create 97;;
let eval_tbl key = eval tbl key;;




-- 
John Skaller, mailto:skaller@users.sf.net
voice: 061-2-9660-0850, 
snail: PO BOX 401 Glebe NSW 2037 Australia
Checkout the Felix programming language http://felix.sf.net



-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2004-06-01 17:40 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-06-01 10:07 [Caml-list] Lazy recomputing Hans Ole Rafaelsen
2004-06-01 11:43 ` Thomas Fischbacher
2004-06-01 12:59   ` skaller
2004-06-01 15:22     ` Hans Ole Rafaelsen
2004-06-01 17:39       ` skaller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).