caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Dustin Sallings <dustin@spy.net>
To: Tyler Eaves <tyler@ml1.net>
Cc: Caml List <caml-list@inria.fr>
Subject: Re: [Caml-list] Frustrated Beginner
Date: Mon, 22 Dec 2003 22:53:30 -0800	[thread overview]
Message-ID: <B7F72AE6-3514-11D8-A8F7-000393CB0F1E@spy.net> (raw)
In-Reply-To: <EAEE2FF2-3510-11D8-B3A1-000A9584A16E@ml1.net>


On Dec 22, 2003, at 22:26, Tyler Eaves wrote:

(I'm sending this back to the list because, as you pointed out, there 
were a few problems with that example, so here's one for the archives).

> Okay, so far so good. I take it that in O'Caml the overhead of a 
> function call is much less than in, say, C? Otherwise this approach 
> would seem to be rather inefficient.

	Well, the short answer is that that's not a function call.  :)  See 
tail-recursion.

	It's also not the best example since it was so simple and didn't 
return anything useful.  Consider this implementation of fold (roughly 
translating it in this email from a scheme version I wrote on my palm):

let rec fold f init lst =
     match lst with
           [] -> init
         | h::t -> fold f (f init h) t
;;

	If you're not familiar with fold, here's an example:

fold (fun v c -> c + v) 0 [1;2;3;4;5;6;7;8;9;10]

	That invocation returns 55.  Basically, the function is called for 
each value in the list (v) and the current value is passed in along 
with the current value during the calculation (c).  When it gets to the 
end (list is []), you return the init value.  Otherwise, you apply the 
function.

	Note that this function could also be written as follows (and probably 
would be):

let rec fold f init = function
       [] -> init
     | h::t -> fold f (f init h) t
;;

> 	Would not Stream.iter be worth considering here? I found that when 
> looking at at the Stream doc.

	Absolutely.  I haven't typically used streams that way.  How 'bout a 
rewrite:

let f = open_in Sys.argv.(1) in
     (* Loop on this stream *)
     Stream.iter (function
         '\t' -> print_string " - tab - "
         | c -> print_char c
     ) (Stream.of_channel f);
     close_in f

>>     (* The previous statement had a sem because it's an imperative 
>> style here *)
>>     close_in f
> 	Will this close EVER be reached? I see only two possibilities, either 
> the stream eventually EOFs, or we've hit an 'infinite' file, such as 
> /dev/random

	Good catch. :)  I think that was another example of using streams a 
bit different from how I usually do, but bad examples are worse than no 
examples.  Or maybe it was one of those ``find the bug'' assignments.  
:)

--
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


  parent reply	other threads:[~2003-12-23  6:53 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-12-23  4:03 Tyler Eaves
2003-12-23  4:19 ` jayanta nath
2003-12-23  5:34   ` Matt Gushee
2003-12-23  6:11     ` Tyler Eaves
2003-12-23  6:21       ` Michael Vanier
2003-12-23  6:31       ` Michael Jeffrey Tucker
2003-12-23 12:16         ` Richard Jones
2003-12-23 20:23           ` Dustin Sallings
2003-12-23  6:32       ` Shawn Wagner
2003-12-23  6:43       ` Matt Gushee
2003-12-23  5:58 ` Dustin Sallings
     [not found]   ` <EAEE2FF2-3510-11D8-B3A1-000A9584A16E@ml1.net>
2003-12-23  6:53     ` Dustin Sallings [this message]
2003-12-23  7:23       ` Tyler Eaves
2003-12-23  8:26         ` Dustin Sallings
2003-12-23  6:20 ` Tom Murray
2003-12-23  8:52 ` Stefano Zacchiroli
2003-12-23 16:47   ` [Caml-list] Ocaml syntax David Brown
2003-12-23 20:19     ` Dustin Sallings
2003-12-23 21:03       ` Eric Merritt
2003-12-23 21:52     ` brogoff
2003-12-24 10:27       ` skaller
2003-12-24 11:42         ` Peter Jolly
2003-12-24 12:19           ` skaller
2003-12-30  8:14     ` dmitry grebeniuk
2003-12-30 17:48       ` David Brown
2003-12-23 10:26 ` [Caml-list] Frustrated Beginner Samuel Lacas
2003-12-23 11:01   ` Dustin Sallings
2003-12-23 14:34     ` Oleg Trott
2003-12-23 20:25       ` Dustin Sallings
2003-12-23 16:11 ` Brian Hurt
2003-12-23 16:20   ` Sven Luther
2003-12-23 16:52     ` David Brown
2003-12-23 20:32       ` Dustin Sallings
2003-12-24 10:41         ` Issac Trotts
2003-12-23 17:39     ` Brian Hurt
2003-12-24  9:35       ` Jacques Garrigue
2003-12-24  9:49 ` skaller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=B7F72AE6-3514-11D8-A8F7-000393CB0F1E@spy.net \
    --to=dustin@spy.net \
    --cc=caml-list@inria.fr \
    --cc=tyler@ml1.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).