* [Caml-list] newbie type problem @ 2003-10-24 6:11 Dustin Sallings 2003-10-23 23:32 ` David Brown 0 siblings, 1 reply; 12+ messages in thread From: Dustin Sallings @ 2003-10-24 6:11 UTC (permalink / raw) To: caml-list I'm fairly new to caml, but have run into something I can't seem to figure out. I'm trying to rewrite an application I'd originally written in python (and scheme, and eiffel, and C, etc...), but I can't seem to figure out how to define the type I want. Basically, it might look something like this: type per_block = { pb_ts: int; pb_counts: [hashtable goes here]; pb_times: [hashtable goes here]; };; Can anybody tell me what I'm actually trying to do here? -- SPY My girlfriend asked me which one I like better. pub 1024/3CAE01D5 1994/11/03 Dustin Sallings <dustin@spy.net> | Key fingerprint = 87 02 57 08 02 D0 DA D6 C8 0F 3E 65 51 98 D8 BE L_______________________ I hope the answer won't upset her. ____________ ------------------- 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] 12+ messages in thread
* Re: [Caml-list] newbie type problem 2003-10-24 6:11 [Caml-list] newbie type problem Dustin Sallings @ 2003-10-23 23:32 ` David Brown 2003-10-24 6:54 ` Dustin Sallings 0 siblings, 1 reply; 12+ messages in thread From: David Brown @ 2003-10-23 23:32 UTC (permalink / raw) To: Dustin Sallings; +Cc: caml-list On Thu, Oct 23, 2003 at 11:11:29PM -0700, Dustin Sallings wrote: > type per_block = { > pb_ts: int; > pb_counts: [hashtable goes here]; > pb_times: [hashtable goes here]; > };; > > Can anybody tell me what I'm actually trying to do here? It is a little hard, since I can't tell what you're trying to represent. Also, a hashtable might not be the best data structure. What information are you trying to keep track of? A hashtable maps objects of one type to another. If you wanted the pb_counts field to map strings to int refs (so you can change the refs), you could use a pb_counts: (string, int ref) Hashtbl.t without more information, it is hard to tell if that is what you really want. Ocaml also has arrays, maps, sets, and there are numerous libraries with other structures as well. Dave Brown ------------------- 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] 12+ messages in thread
* Re: [Caml-list] newbie type problem 2003-10-23 23:32 ` David Brown @ 2003-10-24 6:54 ` Dustin Sallings 2003-10-24 0:52 ` David Brown 2003-10-24 9:25 ` Hendrik Tews 0 siblings, 2 replies; 12+ messages in thread From: Dustin Sallings @ 2003-10-24 6:54 UTC (permalink / raw) To: David Brown; +Cc: caml-list On Thursday, Oct 23, 2003, at 16:32 US/Pacific, David Brown wrote: > It is a little hard, since I can't tell what you're trying to > represent. > Also, a hashtable might not be the best data structure. > > What information are you trying to keep track of? A hashtable maps > objects of one type to another. If you wanted the pb_counts field to > map strings to int refs (so you can change the refs), you could use a > > pb_counts: (string, int ref) Hashtbl.t Yeah, this is the kind of thing I was looking for. I tried a variety of things I thought looked like this. > without more information, it is hard to tell if that is what you really > want. > > Ocaml also has arrays, maps, sets, and there are numerous libraries > with > other structures as well. When picking up a language, there always seems to be a bit of effort required to learn how to read the docs. The docs for Map are pretty much empty, but it does link to the source, which gives me a good idea. I'm not sure how to express my data structure... I'm parsing a log file that contains start and stop timestamps for various transaction types. I want to count up the number and total time of each of these transactions and group them by timestamp rounded to the nearest five minutes. So, it'd look something like this: { 0: < pb_counts = { "T1": 23, "T2": 43 } pb_times = { "T1": 291, "T2": 92 } > 300: < pb_counts = { "T1": 29, "T2": 50 } pb_times = { "T1": 202, "T2": 87 } > } When I spell it out that way, it looks a little less than optimal. However, this is more of a learning tool at this point. Thanks for your help. -- SPY My girlfriend asked me which one I like better. pub 1024/3CAE01D5 1994/11/03 Dustin Sallings <dustin@spy.net> | Key fingerprint = 87 02 57 08 02 D0 DA D6 C8 0F 3E 65 51 98 D8 BE L_______________________ I hope the answer won't upset her. ____________ ------------------- 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] 12+ messages in thread
* Re: [Caml-list] newbie type problem 2003-10-24 6:54 ` Dustin Sallings @ 2003-10-24 0:52 ` David Brown 2003-10-24 8:21 ` Dustin Sallings 2003-10-24 9:25 ` Hendrik Tews 1 sibling, 1 reply; 12+ messages in thread From: David Brown @ 2003-10-24 0:52 UTC (permalink / raw) To: Dustin Sallings; +Cc: David Brown, caml-list On Thu, Oct 23, 2003 at 11:54:07PM -0700, Dustin Sallings wrote: > { 0: < > pb_counts = { "T1": 23, "T2": 43 } > pb_times = { "T1": 291, "T2": 92 } > > > 300: < > pb_counts = { "T1": 29, "T2": 50 } > pb_times = { "T1": 202, "T2": 87 } > > > } > > When I spell it out that way, it looks a little less than optimal. > However, this is more of a learning tool at this point. You may want to consider putting the data for a given transaction type into its own type, and having that be the target of the hashtbl. type transaction_info = { mutable counts : int; mutable times : int; } Then your results could just be a (int * (string, transaction_info) Hashtbl.t) list Dave BTW, this actually seems like a good problem for learning the language. I seem to always choose things too difficult, and end up getting frustrated. BTW, I have found the .mli files for the libraries to be the best documentation. ------------------- 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] 12+ messages in thread
* Re: [Caml-list] newbie type problem 2003-10-24 0:52 ` David Brown @ 2003-10-24 8:21 ` Dustin Sallings 2003-10-24 12:49 ` Andrew Lenharth 2003-10-29 7:23 ` Florian Hars 0 siblings, 2 replies; 12+ messages in thread From: Dustin Sallings @ 2003-10-24 8:21 UTC (permalink / raw) To: David Brown; +Cc: caml-list On Thursday, Oct 23, 2003, at 17:52 US/Pacific, David Brown wrote: > You may want to consider putting the data for a given transaction type > into its own type, and having that be the target of the hashtbl. > > type transaction_info = { > mutable counts : int; > mutable times : int; > } That's exactly what I did, 'cept my time is a float. :) > Then your results could just be a > > (int * (string, transaction_info) Hashtbl.t) list Well, part of the problem is that my log files aren't necessarily sequential, so I have to be able to go back to any point in time and update the thing. Other than that, that's about right (from what I can read of that syntax so far). > BTW, this actually seems like a good problem for learning the language. > I seem to always choose things too difficult, and end up getting > frustrated. It's still plenty foreign to me, but this is complex enough to help me out with a bunch of concepts in the language. What amazes me is the lack of resources I've been able to find in ocaml so far (just googling). It seems like caml's been around for a while, and it works quite well. I wrote these log processor things in python originally because I know it pretty well, but it doesn't run very fast. In my early tests, ocaml and bigloo ran at roughly the same speed, and caml seems very foreign to me. However, recently, I've had a few instability problems with bigloo under certain circumstances. I rewrote that app in ocaml and it was many, many times faster and it worked more reliably. > BTW, I have found the .mli files for the libraries to be the best > documentation. Yeah, but I still couldn't figure out how to make a Map, assuming that's what I really wanted in the first place. A hash table that iterates in key sorted order would make my app faster and reduce complexity. I want to see it actually work first, though. :) -- SPY My girlfriend asked me which one I like better. pub 1024/3CAE01D5 1994/11/03 Dustin Sallings <dustin@spy.net> | Key fingerprint = 87 02 57 08 02 D0 DA D6 C8 0F 3E 65 51 98 D8 BE L_______________________ I hope the answer won't upset her. ____________ ------------------- 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] 12+ messages in thread
* Re: [Caml-list] newbie type problem 2003-10-24 8:21 ` Dustin Sallings @ 2003-10-24 12:49 ` Andrew Lenharth 2003-10-24 13:22 ` Remi Vanicat 2003-10-29 7:23 ` Florian Hars 1 sibling, 1 reply; 12+ messages in thread From: Andrew Lenharth @ 2003-10-24 12:49 UTC (permalink / raw) To: Dustin Sallings; +Cc: caml-list > Yeah, but I still couldn't figure out how to make a Map, assuming > that's what I really wanted in the first place. A hash table that > iterates in key sorted order would make my app faster and reduce > complexity. I want to see it actually work first, though. :) Yes, making a map is non-obvious. One first has to figure out the module system, with no examples. Here is a hint: module StringSet = Set.Make(struct type t = string let compare x y = compare x y end) then you can do things like StringSet.mem n1 set;; StringSet.union s1 s2;; StringSet.add x StringSet.empty;; BTW: I am sure you can do the compare without the x y by compare=compare. A bit about what is going on. Set is a parameratized module which you must narrow to what you want. So you use the Make function to return a module with the types you want. They you can use this module in your code. Good examples of this are few and far between. Andrew Lenharth -- "The reasonable man adapts himself to the world; the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man." -- George Bernard Shaw No matter how cynical you become, it's never enough to keep up. -- Lily Tomlin Fools ignore complexity; pragmatists suffer it; experts avoid it; geniuses remove it. -- A. Perlis ------------------- 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] 12+ messages in thread
* Re: [Caml-list] newbie type problem 2003-10-24 12:49 ` Andrew Lenharth @ 2003-10-24 13:22 ` Remi Vanicat 0 siblings, 0 replies; 12+ messages in thread From: Remi Vanicat @ 2003-10-24 13:22 UTC (permalink / raw) To: Andrew Lenharth; +Cc: Dustin Sallings, caml-list Andrew Lenharth <andrewl@debian.org> writes: >> Yeah, but I still couldn't figure out how to make a Map, assuming >> that's what I really wanted in the first place. A hash table that >> iterates in key sorted order would make my app faster and reduce >> complexity. I want to see it actually work first, though. :) > > Yes, making a map is non-obvious. One first has to figure out the > module system, with no examples. Here is a hint: > > module StringSet = Set.Make(struct type t = string let compare x y = > compare x y end) > > then you can do things like > StringSet.mem n1 set;; > StringSet.union s1 s2;; > StringSet.add x StringSet.empty;; > > BTW: I am sure you can do the compare without the x y by > compare=compare. Yes you can. In recent caml you might even do : module StringSet = Set.Make (String) It work because in the stdlib's String module there is a type t equal to string, and a compare function. -- Rémi Vanicat ------------------- 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] 12+ messages in thread
* Re: [Caml-list] newbie type problem 2003-10-24 8:21 ` Dustin Sallings 2003-10-24 12:49 ` Andrew Lenharth @ 2003-10-29 7:23 ` Florian Hars 2003-10-29 8:03 ` Dustin Sallings 1 sibling, 1 reply; 12+ messages in thread From: Florian Hars @ 2003-10-29 7:23 UTC (permalink / raw) To: Dustin Sallings; +Cc: caml-list Dustin Sallings wrote: > Well, part of the problem is that my log files aren't necessarily > sequential, so I have to be able to go back to any point in time and > update the thing. Last time I had that problem I used two structures: one to keep the open events that come in from the logfiles and one to keep the data for the complete transactions where I have read all the relevant events. If your logfiles are line-oriented (as these critters tend to be), you might want to write a function thats folds a function over all lines of a text file. Then your program will look something like (add error checking, logic for handling overlapping transactions of the same type and missing functions to taste): type evt = Start of string * float | End of string * float | Junk module M = Map.make (struct type t = string let compare = compare end) let parse_line s = if is_start s then Start (get_transaction_type s, get_time_form_log_line s) else if is_end s then End (get_transaction_type s, get_time_from_log_line s) else Junk let operate_on_line (start_events, transactions as init) s = match parse_line s with | Junk -> init | Start (t_type, time) -> M.add t_type time start_events, transactions | End (t_type, time) -> let start_time = M.find t_type start_events in let l = try M.find t_type transactions with Not_found -> [] in M.remove t_type start_events, M.add t_type ((time - start_time)::l) transactions let parse_logfile filename = let ic = open_in filename in let start_events, transactions = Textfile.fold operate_on_line (M.empty, M.empty) ic in close_in ic; cleanup_dangling_events start_events transactions let _ = print_transaction_info (parse_logfile "my_logfile") Yours, Florian. ------------------- 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] 12+ messages in thread
* Re: [Caml-list] newbie type problem 2003-10-29 7:23 ` Florian Hars @ 2003-10-29 8:03 ` Dustin Sallings 2003-10-29 16:27 ` Florian Hars 0 siblings, 1 reply; 12+ messages in thread From: Dustin Sallings @ 2003-10-29 8:03 UTC (permalink / raw) To: Florian Hars; +Cc: caml-list On Oct 28, 2003, at 11:23 PM, Florian Hars wrote: > let parse_logfile filename = > let ic = open_in filename in > let start_events, transactions = > Textfile.fold operate_on_line (M.empty, M.empty) ic in > close_in ic; > cleanup_dangling_events start_events transactions > > let _ = print_transaction_info (parse_logfile "my_logfile") What is Textfile? I wrote something very similar to what I think this is in scheme (from which this thing is being ported somewhat slowly): ; Loop on input, pass each line to function f. ; Optional argument should be either a port, or a filename. If not ; provided, (current-input-port) will be used. (input-loop f . other) ; A conditional input loop (only loop on a line if (c line) is true) (conditional-input-loop c f . other) I'll probably do the same thing in caml when I get this a little more out of the toy phase. Thanks for the input. -- Dustin Sallings ------------------- 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] 12+ messages in thread
* Re: [Caml-list] newbie type problem 2003-10-29 8:03 ` Dustin Sallings @ 2003-10-29 16:27 ` Florian Hars 0 siblings, 0 replies; 12+ messages in thread From: Florian Hars @ 2003-10-29 16:27 UTC (permalink / raw) To: Dustin Sallings; +Cc: caml-list Dustin Sallings wrote: > What is Textfile? I wrote something very similar to what I think > this is in scheme (from which this thing is being ported somewhat slowly): > > ; Loop on input, pass each line to function f. Yes, it is one of those module everybody writes. My version contains functions val iter : (string -> unit) -> in_channel -> unit val fold : ('a -> string -> 'a) -> 'a -> in_channel -> 'a doing the obvious things with the lines read from the in_channel. Yours, Florian. ------------------- 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] 12+ messages in thread
* Re: [Caml-list] newbie type problem 2003-10-24 6:54 ` Dustin Sallings 2003-10-24 0:52 ` David Brown @ 2003-10-24 9:25 ` Hendrik Tews 2003-10-24 16:23 ` Dustin Sallings 1 sibling, 1 reply; 12+ messages in thread From: Hendrik Tews @ 2003-10-24 9:25 UTC (permalink / raw) To: caml-list Dustin Sallings writes: When picking up a language, there always seems to be a bit of effort required to learn how to read the docs. The docs for Map are pretty much empty, but it does link to the source, which gives me a good idea. The txt version contains almost 200 lines for Map, describing 9 constants, 2 types and one functor. The same information is in all the other versions. Maybe you have not seen the documentation yet, because you have not clicked on "Make" or "S"? Bye, Hendrik ------------------- 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] 12+ messages in thread
* Re: [Caml-list] newbie type problem 2003-10-24 9:25 ` Hendrik Tews @ 2003-10-24 16:23 ` Dustin Sallings 0 siblings, 0 replies; 12+ messages in thread From: Dustin Sallings @ 2003-10-24 16:23 UTC (permalink / raw) To: Hendrik Tews; +Cc: caml-list On Friday, Oct 24, 2003, at 02:25 US/Pacific, Hendrik Tews wrote: > Dustin Sallings writes: > >> When picking up a language, there always seems to be a bit of >> effort >> required to learn how to read the docs. The docs for Map are >> pretty >> much empty, but it does link to the source, which gives me a good >> idea. > > The txt version contains almost 200 lines for Map, describing 9 > constants, 2 types and one functor. The same information is in > all the other versions. Maybe you have not seen the documentation > yet, because you have not clicked on "Make" or "S"? You are correct. Like I said, takes a little while to get used to doc navigation. :) Thanks. -- Dustin Sallings ------------------- 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] 12+ messages in thread
end of thread, other threads:[~2003-10-29 16:27 UTC | newest] Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2003-10-24 6:11 [Caml-list] newbie type problem Dustin Sallings 2003-10-23 23:32 ` David Brown 2003-10-24 6:54 ` Dustin Sallings 2003-10-24 0:52 ` David Brown 2003-10-24 8:21 ` Dustin Sallings 2003-10-24 12:49 ` Andrew Lenharth 2003-10-24 13:22 ` Remi Vanicat 2003-10-29 7:23 ` Florian Hars 2003-10-29 8:03 ` Dustin Sallings 2003-10-29 16:27 ` Florian Hars 2003-10-24 9:25 ` Hendrik Tews 2003-10-24 16:23 ` Dustin Sallings
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox