caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Brian Hurt <brian.hurt@qlogic.com>
To: Siegfried Gonzi <siegfried.gonzi@stud.uni-graz.at>
Cc: Brian Hurt <brian.hurt@qlogic.com>,
	Ocaml Mailing List <caml-list@inria.fr>
Subject: Re: [Caml-list] Easy solution in OCaml?
Date: Mon, 28 Apr 2003 10:43:01 -0500 (CDT)	[thread overview]
Message-ID: <Pine.LNX.4.33.0304281009310.3160-100000@eagle.ancor.com> (raw)
In-Reply-To: <3EABF0AF.10503@stud.uni-graz.at>

On Sun, 27 Apr 2003, Siegfried Gonzi wrote:

> It is often very comfortable to use this sort of bad hacking, because in 
> science when you develop new functions or tries to solve problems you 
> often do not know in advance what you want and not.
> 
> For example: function1 has as return: erg1 = (list (list 2 3 4))
> 
> function2 expects output from function1  and function2 uses this output 
> as follows:
> 
> (list-ref  erg1 0)
> 
> But now I decide for reason of its own that erg1 should include just one 
> more information:
> 
> erg1 = (list1 (list 2 3 4)  (list (vector 2 3 4) "nice day"))
> 
> function2 now is not affected because it always uses the first element 
> of the list, but it dramatically shortens your development time, because 
> you do not have to cope with other structures or tuples in erg1 as you 
> would do lets say in Clean. And you do not have to change  all your 
> other dependencies.

It allows you to ignore the bug.  And it may not bite you.  But that 
doesn't mean it's still not a bug.  Otherwise, you need to define what 
"nice day"/3 is.

Although it's looking like you want to use tuples, not lists.  It's 
perfectly valid, in ocaml, to do:

[ 2; 3; 4 ], ( [| 2; 3; 4 |], "nice day" )

Tuples are sort of a lazy man's structure.  Or you can actually define a 
structure- which has the advantage that you can reference members by name, 
and ignore members you don't care about.  So you might want to do:

type foo_t = { datalist : int list ; 
               datavector : int array ; 
               otherinfo : string
             };;

let get_foo : ... -> foo_t = fun ... -> ... ;;

(* All I want to deal with is the int list- ignore the rest *)
    let mylist = (get_foo ...).datalist
    in ...

This allows you to add elements to the structure foo_t and the above code 
will simply ignore them.

> 
> This was the reason to ask in my first post of the topic are there any 
> guys out there who successfully use OCaml for data evaluation or lets 
> call it statistic (which means reading files, coping with array and 
> lists and that sort of). Maybe the aforementioned bad feature of 
> Scheme/Lisp/Python... makes them that usefull for coping with "dynamic" 
> data.

It lets you program by coincidence.  Which may be forgivable for a 
throw-away program, but it's still a bad idea.  Nothing is as permanent as 
that which is called temporary.

> 
> This also  leads to the question: is development time really reduced in 
> (strict typed) functional programming, or is it only reduced when you 
> compare quicksort in Haskell and the verbose version in C.
> 

I'm a C pro.  It's been my main language for more than a decade now.  I
mean, I know what a sequence point is- and why they exist.  I'm an ocaml
newbie, I've only been coding in Ocaml for a couple of months now, and I'm
still learning the language (so my code is likely not going to be the best
example of how to do things in Ocaml).  But I'm already at least as
efficient in Ocaml than I am in C, in terms of correct behaviors per hour
of work.

There are lots of reasons for this, but one of the big ones is the type
checking system plus type inference.  I have, on occasion, had to stare at
an ocaml error message for upwards of ten minutes to figure out what was
wrong.  As I become more familiar with ocaml, such "puzzler" errors are
becoming less and less frequent.  If I have to fire up a debugger,
reproduce the problem, and figure out what the problem is, ten minutes is
closer to the minimum.  The worst bug I've ever had to track down took me
a solid *month* of 60-hour weeks to figure out (and resulted in a two-line
change in the code).  So every bug, every problem, the compiler can find
for me is an incredible time savings and an incredible productivity boost.

Yes, I compile with warnings on.  All of them.  And treat warnings as 
errors.  And no, my code doesn't have signifigantly more typedefs than 
normal code does- because even in my C code I think about what types 
things should be.  Loop variables are not implicitly an int, for example 
(actually, size_t is the most common loop variable type in my code).  If 
the variables are the correct type to begin with, you don't need to 
typecast them.

With type inference, most of the bondage & discipline aspects of strong
typing (that we all learned to hate with languages like Pascal and Java)
are gone.  You get all the benefits of strong typing without the
annoyances.  Let the compiler figure out what types things should be.

Brian


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


  reply	other threads:[~2003-04-28 15:34 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-04-25  6:05 Siegfried Gonzi
2003-04-25  8:19 ` sebastien FURIC
2003-04-25 15:46 ` Brian Hurt
2003-04-25 16:34   ` Ville-Pertti Keinonen
2003-04-26 13:45   ` Siegfried Gonzi
2003-04-26 21:51     ` Brian Hurt
2003-04-27 15:01       ` Siegfried Gonzi
2003-04-28 15:43         ` Brian Hurt [this message]
2003-04-29  5:46         ` John Max Skaller
2003-04-27 16:33       ` [Caml-list] Re: IEEE-754 (was: Easy solution in OCaml?) Christophe TROESTLER
2003-04-25 16:59 ` [Caml-list] Easy solution in OCaml? Markus Mottl
2003-04-26  6:25   ` Siegfried Gonzi
2003-04-27 14:13   ` Siegfried Gonzi
2003-04-27 16:54     ` Eray Ozkural
2003-04-28  5:00       ` Siegfried Gonzi
2003-04-28 17:45 ` malc
2003-04-28 18:16   ` Shivkumar Chandrasekaran
     [not found] <20030427164326.34082.qmail@web41211.mail.yahoo.com>
2003-04-28 12:05 ` Siegfried Gonzi
2003-04-28 13:54   ` Noel Welsh
2003-04-28 14:22   ` David Brown
2003-04-28 14:38     ` sebastien FURIC
2003-04-28 18:14     ` Eray Ozkural
2003-05-03 14:37       ` John Max Skaller
2003-05-03 16:57         ` Eray Ozkural
2003-04-28 15:27 isaac gouy
2003-04-28 16:38 ` brogoff
2003-04-28 17:13   ` isaac gouy
2003-04-28 17:48   ` Brian Hurt
2003-04-28 17:50     ` brogoff
2003-04-28 18:31       ` Eray Ozkural
2003-04-29  6:46       ` Siegfried Gonzi

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=Pine.LNX.4.33.0304281009310.3160-100000@eagle.ancor.com \
    --to=brian.hurt@qlogic.com \
    --cc=caml-list@inria.fr \
    --cc=siegfried.gonzi@stud.uni-graz.at \
    /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).