* [Caml-list] failwith, raise and type inference @ 2004-04-02 13:41 Paul Guyot 2004-04-02 13:49 ` Frederic van der Plancke ` (3 more replies) 0 siblings, 4 replies; 24+ messages in thread From: Paul Guyot @ 2004-04-02 13:41 UTC (permalink / raw) To: caml-list Hello, My students came up with a behavior of ocaml I couldn't explain. I have exactly the same result with 3.07pl2 and a fresh copy checked out from CVS. >let rec f1 key dict = > match dict with > [] -> failwith "The key " ^ key ^ " could not be found" > | (aKey, aValue)::tail -> > if (aKey = key) > then aValue > else f1 key tail;; is of type: val f1 : string -> (string * string) list -> string = <fun> while: >exception SomeException of string;; > >let rec f2 key dict = > match dict with > [] -> raise (SomeException key) > | (aKey, aValue)::tail -> > if (aKey = key) > then aValue > else f2 key tail;; is of type: val f2 : string -> (string * 'a) list -> 'a = <fun> Considering that failwith is of type string -> 'a and raise of type exn -> 'a, I couldn't figure out why the correct type for f is only infered with raise. Any idea? Paul -- Philosophie de baignoire - consultations sur rendez-vous. NPDS/NewtonOS: http://newton.kallisys.net:8080/ Apache/FreeBSD: http://www.kallisys.com/ ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-02 13:41 [Caml-list] failwith, raise and type inference Paul Guyot @ 2004-04-02 13:49 ` Frederic van der Plancke 2004-04-02 13:56 ` Paul Guyot 2004-04-02 13:51 ` Nicolas Cannasse ` (2 subsequent siblings) 3 siblings, 1 reply; 24+ messages in thread From: Frederic van der Plancke @ 2004-04-02 13:49 UTC (permalink / raw) To: caml-list Just a small precedence bug. failwith "The key " ^ key ^ " could not be found" is equivalent to: (failwith "The key ") ^ key ^ " could not be found" and not to: failwith ("The key " ^ key ^ " could not be found") F. Paul Guyot wrote: > > Hello, > > My students came up with a behavior of ocaml I couldn't explain. > I have exactly the same result with 3.07pl2 and a fresh copy checked > out from CVS. > > >let rec f1 key dict = > > match dict with > > [] -> failwith "The key " ^ key ^ " could not be found" > > | (aKey, aValue)::tail -> > > if (aKey = key) > > then aValue > > else f1 key tail;; > > is of type: > > val f1 : string -> (string * string) list -> string = <fun> > > while: > > >exception SomeException of string;; > > > >let rec f2 key dict = > > match dict with > > [] -> raise (SomeException key) > > | (aKey, aValue)::tail -> > > if (aKey = key) > > then aValue > > else f2 key tail;; > > is of type: > > val f2 : string -> (string * 'a) list -> 'a = <fun> > > Considering that failwith is of type string -> 'a and raise of type > exn -> 'a, I couldn't figure out why the correct type for f is only > infered with raise. > > Any idea? > > Paul > -- > Philosophie de baignoire - consultations sur rendez-vous. > > NPDS/NewtonOS: http://newton.kallisys.net:8080/ > Apache/FreeBSD: http://www.kallisys.com/ > > ------------------- > 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 ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-02 13:49 ` Frederic van der Plancke @ 2004-04-02 13:56 ` Paul Guyot 0 siblings, 0 replies; 24+ messages in thread From: Paul Guyot @ 2004-04-02 13:56 UTC (permalink / raw) To: fvdp, caml-list À (At) 13:49 +0000 2/04/04, Frederic van der Plancke écrivait (wrote) : >Just a small precedence bug. > >failwith "The key " ^ key ^ " could not be found" > >is equivalent to: > >(failwith "The key ") ^ key ^ " could not be found" > >and not to: > >failwith ("The key " ^ key ^ " could not be found") Oh yeah, that's obviously that. :) Thanks for all the replies. Paul -- Philosophie de baignoire - consultations sur rendez-vous. NPDS/NewtonOS: http://newton.kallisys.net:8080/ Apache/FreeBSD: http://www.kallisys.com/ ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-02 13:41 [Caml-list] failwith, raise and type inference Paul Guyot 2004-04-02 13:49 ` Frederic van der Plancke @ 2004-04-02 13:51 ` Nicolas Cannasse 2004-04-02 13:59 ` Correnson Loïc 2004-04-02 14:09 ` Luc Maranget 3 siblings, 0 replies; 24+ messages in thread From: Nicolas Cannasse @ 2004-04-02 13:51 UTC (permalink / raw) To: caml-list, Paul Guyot > >let rec f1 key dict = > > match dict with > > [] -> failwith "The key " ^ key ^ " could not be found" > > | (aKey, aValue)::tail -> > > if (aKey = key) > > then aValue > > else f1 key tail;; The tip is here : failwith "The key " ^ key ^ " could not be found" is actually equivalent to : (failwith "The key ") ^ key ^ " could not be found" and different from (what you were thinking) : failwith ("The key " ^ key ^ " could not be found") Regards, Nicolas Cannasse ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-02 13:41 [Caml-list] failwith, raise and type inference Paul Guyot 2004-04-02 13:49 ` Frederic van der Plancke 2004-04-02 13:51 ` Nicolas Cannasse @ 2004-04-02 13:59 ` Correnson Loïc 2004-04-02 14:09 ` Luc Maranget 3 siblings, 0 replies; 24+ messages in thread From: Correnson Loïc @ 2004-04-02 13:59 UTC (permalink / raw) To: Paul Guyot; +Cc: Ocaml Bad priority between operators and function call: (failwith a ^ b) must be understood as (failwith a)^b. L. ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-02 13:41 [Caml-list] failwith, raise and type inference Paul Guyot ` (2 preceding siblings ...) 2004-04-02 13:59 ` Correnson Loïc @ 2004-04-02 14:09 ` Luc Maranget 2004-04-02 19:39 ` [Caml-list] weird floating poing behavior on windows Zeno Lee 2004-04-02 20:28 ` [Caml-list] failwith, raise and type inference Pierre Weis 3 siblings, 2 replies; 24+ messages in thread From: Luc Maranget @ 2004-04-02 14:09 UTC (permalink / raw) To: Paul Guyot; +Cc: caml-list > Hello, > > My students came up with a behavior of ocaml I couldn't explain. > I have exactly the same result with 3.07pl2 and a fresh copy checked > out from CVS. > > >let rec f1 key dict = > > match dict with > > [] -> failwith "The key " ^ key ^ " could not be found" > > | (aKey, aValue)::tail -> > > if (aKey = key) > > then aValue > > else f1 key tail;; > > is of type: > > val f1 : string -> (string * string) list -> string = <fun> > > Any idea? I think I have a clue : failwith "The key " ^ key ^ " could not be found" is parsed as (failwith "The key ") ^ key ^ " could not be found" Hence the overall type of this expression is string. The other result of the pattern matching matching has the same type as aValue Finally, you get that the type of aValue (second component of your pairs is string). I think you can check my interpretation by issuing >f1 "bonga" [] >;; Exception: Failure "The key ". Of course, the intended coding is failwith ("The key " ^ key ^ " could not be found") Admitedly caml syntax is not very beginner friendly. But the observed parsing has some internal logics. On usualy understand that f x + y is in fact (f x) + y But here, with failwith being a ``special'' function and ^ a ``special'' operator, well... Cheers, --Luc Maranget ------------------- 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] 24+ messages in thread
* [Caml-list] weird floating poing behavior on windows 2004-04-02 14:09 ` Luc Maranget @ 2004-04-02 19:39 ` Zeno Lee 2004-04-02 20:03 ` Greg Bacon ` (2 more replies) 2004-04-02 20:28 ` [Caml-list] failwith, raise and type inference Pierre Weis 1 sibling, 3 replies; 24+ messages in thread From: Zeno Lee @ 2004-04-02 19:39 UTC (permalink / raw) To: caml-list Can anyone tell me what's going on here? Is this a known issue on windows? C:\>ocaml Objective Caml version 3.07+2 # 0.2 *. 0.26;; - : float = 0.052000000000000005 # 0.8 *. 0.7 *. 0.8;; - : float = 0.44799999999999995 ------------------- 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] 24+ messages in thread
* Re: [Caml-list] weird floating poing behavior on windows 2004-04-02 19:39 ` [Caml-list] weird floating poing behavior on windows Zeno Lee @ 2004-04-02 20:03 ` Greg Bacon 2004-04-02 20:07 ` David Brown 2004-04-02 21:58 ` Brian Hurt 2 siblings, 0 replies; 24+ messages in thread From: Greg Bacon @ 2004-04-02 20:03 UTC (permalink / raw) To: Zeno Lee; +Cc: caml-list In message <008101c418ea$3ff43780$6401a8c0@xp>, "Zeno Lee" writes: : Can anyone tell me what's going on here? Is this a known issue on : windows? : : C:\>ocaml : Objective Caml version 3.07+2 : # 0.2 *. 0.26;; : - : float = 0.052000000000000005 : # 0.8 *. 0.7 *. 0.8;; : - : float = 0.44799999999999995 It's a known issue on digital computers, i.e., with finite-precision arithmetic. See "What Every Computer Scientist Should Know About Floating-Point Arithmetic": http://www.validlab.com/goldberg/paper.pdf Greg ------------------- 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] 24+ messages in thread
* Re: [Caml-list] weird floating poing behavior on windows 2004-04-02 19:39 ` [Caml-list] weird floating poing behavior on windows Zeno Lee 2004-04-02 20:03 ` Greg Bacon @ 2004-04-02 20:07 ` David Brown 2004-04-02 20:31 ` Zeno Lee 2004-04-02 21:58 ` Brian Hurt 2 siblings, 1 reply; 24+ messages in thread From: David Brown @ 2004-04-02 20:07 UTC (permalink / raw) To: Zeno Lee; +Cc: caml-list On Fri, Apr 02, 2004 at 02:39:43PM -0500, Zeno Lee wrote: > Can anyone tell me what's going on here? Is this a known issue on windows? > > C:\>ocaml > Objective Caml version 3.07+2 > # 0.2 *. 0.26;; > - : float = 0.052000000000000005 > # 0.8 *. 0.7 *. 0.8;; > - : float = 0.44799999999999995 Nothing unusual. Floats only have a certain amount of precision. The toplevel prints floats out with more precision than they contain. It does the same thing on Linux. For example, in C: #include <stdio.h> int main (int argc, char **argv) { printf ("%.17g\n", 0.2 * 0.26); printf ("%.17g\n", 0.8 * 0.7 * 0.8); return 0; } prints: 0.052000000000000005 0.44799999999999995 Now the real question is why does the toplevel do this (and where, in the code is it coming from). string_of_float only uses 12 digits. 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] 24+ messages in thread
* Re: [Caml-list] weird floating poing behavior on windows 2004-04-02 20:07 ` David Brown @ 2004-04-02 20:31 ` Zeno Lee 2004-04-02 20:50 ` Pierre Weis 2004-04-02 22:01 ` Brian Hurt 0 siblings, 2 replies; 24+ messages in thread From: Zeno Lee @ 2004-04-02 20:31 UTC (permalink / raw) To: David Brown; +Cc: caml-list This does not happen to me on Solaris from which I do all my ocaml work, but I happened to be using the toplevel on windows as a quick and dirty calculator when I noticed the different behavior. solaris$ ocaml Objective Caml version 3.06 # 0.8 *. 0.7 *. 0.8;; - : float = 0.448 however, when I use your example c program on the same solaris machine it prints out 0.44799999999999995 ----- Original Message ----- From: "David Brown" <caml-list@davidb.org> To: "Zeno Lee" <zeno.lee@earthlink.net> Cc: <caml-list@inria.fr> Sent: Friday, April 02, 2004 3:07 PM Subject: Re: [Caml-list] weird floating poing behavior on windows > On Fri, Apr 02, 2004 at 02:39:43PM -0500, Zeno Lee wrote: > > Can anyone tell me what's going on here? Is this a known issue on windows? > > > > C:\>ocaml > > Objective Caml version 3.07+2 > > # 0.2 *. 0.26;; > > - : float = 0.052000000000000005 052000000000000005 > > # 0.8 *. 0.7 *. 0.8;; > > - : float = 0.44799999999999995 > > Nothing unusual. Floats only have a certain amount of precision. The > toplevel prints floats out with more precision than they contain. It > does the same thing on Linux. > > For example, in C: > > #include <stdio.h> > > int > main (int argc, char **argv) > { > printf ("%.17g\n", 0.2 * 0.26); > printf ("%.17g\n", 0.8 * 0.7 * 0.8); > return 0; > } > > prints: > 0.052000000000000005 > 0.44799999999999995 > > Now the real question is why does the toplevel do this (and where, in > the code is it coming from). string_of_float only uses 12 digits. > > 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] 24+ messages in thread
* Re: [Caml-list] weird floating poing behavior on windows 2004-04-02 20:31 ` Zeno Lee @ 2004-04-02 20:50 ` Pierre Weis 2004-04-02 22:01 ` Brian Hurt 1 sibling, 0 replies; 24+ messages in thread From: Pierre Weis @ 2004-04-02 20:50 UTC (permalink / raw) To: Zeno Lee; +Cc: caml-list, caml-list > This does not happen to me on Solaris from which I do all my ocaml work, but > I happened to be using the toplevel on windows as a quick and dirty > calculator when I noticed the different behavior. > > solaris$ ocaml > Objective Caml version 3.06 ^ You are using version 3.06 on Solaris and 3.07 on Windows: the way the top-level prints floats has changed in version 3.07. Regards, Pierre Weis INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/ ------------------- 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] 24+ messages in thread
* Re: [Caml-list] weird floating poing behavior on windows 2004-04-02 20:31 ` Zeno Lee 2004-04-02 20:50 ` Pierre Weis @ 2004-04-02 22:01 ` Brian Hurt 1 sibling, 0 replies; 24+ messages in thread From: Brian Hurt @ 2004-04-02 22:01 UTC (permalink / raw) To: Zeno Lee; +Cc: David Brown, caml-list On Fri, 2 Apr 2004, Zeno Lee wrote: > This does not happen to me on Solaris from which I do all my ocaml work, but > I happened to be using the toplevel on windows as a quick and dirty > calculator when I noticed the different behavior. Gnu Libc has special hacks in it so that it will want to print out 2.0 instead of 1.9999999997824 etc. Which masks the error, it doesn't eliminate it. -- "Usenet is like a herd of performing elephants with diarrhea -- massive, difficult to redirect, awe-inspiring, entertaining, and a source of mind-boggling amounts of excrement when you least expect it." - Gene Spafford 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 ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Caml-list] weird floating poing behavior on windows 2004-04-02 19:39 ` [Caml-list] weird floating poing behavior on windows Zeno Lee 2004-04-02 20:03 ` Greg Bacon 2004-04-02 20:07 ` David Brown @ 2004-04-02 21:58 ` Brian Hurt 2 siblings, 0 replies; 24+ messages in thread From: Brian Hurt @ 2004-04-02 21:58 UTC (permalink / raw) To: Zeno Lee, Ocaml Mailing List On Fri, 2 Apr 2004, Zeno Lee wrote: > Can anyone tell me what's going on here? Is this a known issue on windows? This is a known issue with floating point numbers. Take a class or get a book on numerical analysis is my recommendation. Here's the basic problem: let's assume our machine works in base 10 instead of base 2, and that floating point numbers only hold 4 decimal digits. So how does the machine represent 1.0/3.0? It can't, not exactly. It's instead represented as 0.3333. Four digits of accuracy, remember? So we take this number, and multiply it by 3.0, we get not the expected answer of 1.0, but instead 0.3333*3, or 0.9999. Opps. Now, in finite precision binary fp, we can't exactly represent 1/5th, just like we can't exactly represent 1/3 in finite precision decimal. The system gets "close", but can't do it exactly, so every once in a while you get an answer a little larger or smaller than expected. Even worse, these small errors can accumulate, snowballing into huge errors. A lot of very intelligent people spend years making algorithms in which these errors tend to cancel each other out instead of accumulating- so that if this calculation comes out a little high, the next calculation will likely come out a little low. You can get a PhD and spend your life doing this, and a lot of people have. My recommendation is to simply get a book, and do things the way they tell you to. -- "Usenet is like a herd of performing elephants with diarrhea -- massive, difficult to redirect, awe-inspiring, entertaining, and a source of mind-boggling amounts of excrement when you least expect it." - Gene Spafford 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 ^ permalink raw reply [flat|nested] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-02 14:09 ` Luc Maranget 2004-04-02 19:39 ` [Caml-list] weird floating poing behavior on windows Zeno Lee @ 2004-04-02 20:28 ` Pierre Weis 2004-04-05 22:52 ` Ker Lutyn 1 sibling, 1 reply; 24+ messages in thread From: Pierre Weis @ 2004-04-02 20:28 UTC (permalink / raw) To: Luc Maranget; +Cc: pguyot, caml-list [...] > Admitedly caml syntax is not very beginner friendly. > But the observed parsing has some internal logics. > > On usualy understand that f x + y is in fact (f x) + y > But here, with failwith being a ``special'' function and ^ a ``special'' > operator, well... That could be part of the problem: failwith is not ``special'' nor is ^, hence the regular treatment of f x ^ y as (f x) ^ y and failwith x ^ y as (failwith x) ^ y. Operator precedence in Caml has been carefully crafted, you should have a look at the programming guide lines that gives some hints on the internal logics of some parts of the parsing, in the section When to use parentheses within an expression Best regards, Pierre Weis INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/ ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-02 20:28 ` [Caml-list] failwith, raise and type inference Pierre Weis @ 2004-04-05 22:52 ` Ker Lutyn 2004-04-06 1:07 ` Jacques Garrigue 2004-04-06 1:15 ` Christophe TROESTLER 0 siblings, 2 replies; 24+ messages in thread From: Ker Lutyn @ 2004-04-05 22:52 UTC (permalink / raw) To: Pierre Weis, Luc Maranget; +Cc: pguyot, caml-list I wonder if we could have Haskell's $ operator added to OCaml. It would make this idiom and a lot of my code nicer. failwith $ "foo" ^ "bar" Defining it myself as let ($) f x = f x doesn't work because of precedence and associativity. The caml sources frequently define let (++) x f = f x which is a similar idea - but lots of times Haskell's $ is what you want. --- Pierre Weis <pierre.weis@inria.fr> wrote: > [...] > > Admitedly caml syntax is not very beginner friendly. > > But the observed parsing has some internal logics. > > > > On usualy understand that f x + y is in fact (f x) + y > > But here, with failwith being a ``special'' function and ^ a ``special'' > > operator, well... > > That could be part of the problem: failwith is not ``special'' nor is ^, > hence the regular treatment of f x ^ y as (f x) ^ y and failwith x ^ y > as (failwith x) ^ y. > > Operator precedence in Caml has been carefully crafted, you should > have a look at the programming guide lines that gives some hints on the > internal logics of some parts of the parsing, in the section > > When to use parentheses within an expression > > Best regards, > > Pierre Weis > > INRIA, Projet Cristal, Pierre.Weis@inria.fr, http://pauillac.inria.fr/~weis/ > > > ------------------- > 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 __________________________________ Do you Yahoo!? Yahoo! Small Business $15K Web Design Giveaway http://promotions.yahoo.com/design_giveaway/ ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-05 22:52 ` Ker Lutyn @ 2004-04-06 1:07 ` Jacques Garrigue 2004-04-06 5:23 ` Issac Trotts 2004-04-06 1:15 ` Christophe TROESTLER 1 sibling, 1 reply; 24+ messages in thread From: Jacques Garrigue @ 2004-04-06 1:07 UTC (permalink / raw) To: ker527mail; +Cc: caml-list From: Ker Lutyn <ker527mail@yahoo.com> > I wonder if we could have Haskell's $ operator added to OCaml. It would make > this idiom and a lot of my code nicer. > > failwith $ "foo" ^ "bar" > > Defining it myself as > > let ($) f x = f x > > doesn't work because of precedence and associativity. The caml sources > frequently define > > let (++) x f = f x > > which is a similar idea - but lots of times Haskell's $ is what you want. This doesn't look very much related to the original thread. But you just have to find an operator with the right associativity. let (@<) f x = f x ;; print_string @< String.capitalize @< "foo" ^ "bar" ;; Since the first character decides the associativity, you might also choose @@, @>, or anything you like. ^^, ^@, ... would have the same associativity and precedence also. Look at section 6.7 of the manual for infix operators and their precedences. Jacques Garrigue ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-06 1:07 ` Jacques Garrigue @ 2004-04-06 5:23 ` Issac Trotts 2004-04-06 15:15 ` skaller 0 siblings, 1 reply; 24+ messages in thread From: Issac Trotts @ 2004-04-06 5:23 UTC (permalink / raw) To: caml-list > This doesn't look very much related to the original thread. > But you just have to find an operator with the right associativity. > > let (@<) f x = f x ;; > print_string @< String.capitalize @< "foo" ^ "bar" ;; > > Since the first character decides the associativity, you might also > choose @@, @>, or anything you like. ^^, ^@, ... would have the same > associativity and precedence also. > Look at section 6.7 of the manual for infix operators and their > precedences. Why not just use parens? -- Issac Trotts http://mallorn.ucdavis.edu/~ijtrotts (w) 530-757-8789 ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-06 5:23 ` Issac Trotts @ 2004-04-06 15:15 ` skaller 0 siblings, 0 replies; 24+ messages in thread From: skaller @ 2004-04-06 15:15 UTC (permalink / raw) To: Issac Trotts; +Cc: caml-list On Tue, 2004-04-06 at 15:23, Issac Trotts wrote: > > This doesn't look very much related to the original thread. > > But you just have to find an operator with the right associativity. > Why not just use parens? .. because we want to write Ocaml not Lisp? <j/k> -- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-05 22:52 ` Ker Lutyn 2004-04-06 1:07 ` Jacques Garrigue @ 2004-04-06 1:15 ` Christophe TROESTLER 2004-04-06 7:05 ` skaller 1 sibling, 1 reply; 24+ messages in thread From: Christophe TROESTLER @ 2004-04-06 1:15 UTC (permalink / raw) To: O'Caml Mailing List > --- Pierre Weis <pierre.weis@inria.fr> wrote: > > [...] > > Operator precedence in Caml has been carefully crafted, you should Well I have a little question on this. The guide says "Arithmetic operators: the same rules as in mathematics." but -. 3.**2. returns 9. while in math -x^2 means -(x^2) and not (-x)^2 ! I am curious why such an oddity. Cheers, ChriS ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-06 1:15 ` Christophe TROESTLER @ 2004-04-06 7:05 ` skaller 2004-04-06 11:29 ` Eric C. Cooper 2004-04-09 7:18 ` Christophe TROESTLER 0 siblings, 2 replies; 24+ messages in thread From: skaller @ 2004-04-06 7:05 UTC (permalink / raw) To: Christophe TROESTLER; +Cc: O'Caml Mailing List On Tue, 2004-04-06 at 11:15, Christophe TROESTLER wrote: > Well I have a little question on this. The guide says "Arithmetic > operators: the same rules as in mathematics." but > > -. 3.**2. > > returns 9. while in math -x^2 means -(x^2) and not (-x)^2 ! I am > curious why such an oddity. The correct grammar here is rather nasty. I use it in Felix, but i'm not at all sure it's a good idea. The problem comes with: -x^2, x^-2, x^2^3 which are -(x^2), x^(-2), x^(2^3) I use this grammar (which I hope delivers the above), and is supposed to be the same as FORTRAN: the nastiness is the 'uplink' from power to prefixed. term: ... prefixed { $1 } prefixed: | PLUS power { apl $1 "pos" $2 } | MINUS power { apl $1 "neg" $2 } | TILDE power { apl $1 "compl" $2 } | power { $1 } /* exponentiation is right associative */ power: | superscript STARSTAR prefixed { apl2 $2 "pow" [$1; $3] } | superscript { $1 } superscript: ... Knuth found this whole idea so distasteful that in TeX the rule is that ^ and _ (super and subscript operators) are unassociative and require explicit bracketing. Consider also: fgx which usually means f(g(x)) but can also mean (fg)x ... I'm not sure there *are* any 'usual' rules in maths. -- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-06 7:05 ` skaller @ 2004-04-06 11:29 ` Eric C. Cooper 2004-04-09 7:18 ` Christophe TROESTLER 1 sibling, 0 replies; 24+ messages in thread From: Eric C. Cooper @ 2004-04-06 11:29 UTC (permalink / raw) To: O'Caml Mailing List On Tue, Apr 06, 2004 at 05:05:44PM +1000, skaller wrote: > I'm not sure there *are* any 'usual' rules in maths. Yes, traditional math notation needs human disambiguation: consider sin^2 (x) versus sin^{-1} (x) I don't think we want to require AI in the ocaml parser ... -- Eric C. Cooper e c c @ c m u . e d u ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-06 7:05 ` skaller 2004-04-06 11:29 ` Eric C. Cooper @ 2004-04-09 7:18 ` Christophe TROESTLER 2004-04-09 7:32 ` Xavier Leroy 1 sibling, 1 reply; 24+ messages in thread From: Christophe TROESTLER @ 2004-04-09 7:18 UTC (permalink / raw) To: skaller; +Cc: caml-list On 06 Apr 2004, skaller <skaller@users.sourceforge.net> wrote: > > On Tue, 2004-04-06 at 11:15, Christophe TROESTLER wrote: > > > -. 3.**2. > > > > returns 9. while in math -x^2 means -(x^2) and not (-x)^2 ! > > I'm not sure there *are* any 'usual' rules in maths. Well -x^2 as meaning -(x^2) *is* a usual rule -- no mathematician will ever understand it as (-x)^2. Still my question remains as whether the above is intended by the OCaml developpers or is just a case that "slipped through" (and an oddity that has bitten me once). ChriS ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-09 7:18 ` Christophe TROESTLER @ 2004-04-09 7:32 ` Xavier Leroy 2004-04-09 8:03 ` skaller 0 siblings, 1 reply; 24+ messages in thread From: Xavier Leroy @ 2004-04-09 7:32 UTC (permalink / raw) To: Christophe TROESTLER; +Cc: skaller, caml-list > > > -. 3.**2. > > > > > > returns 9. while in math -x^2 means -(x^2) and not (-x)^2 ! > > > > I'm not sure there *are* any 'usual' rules in maths. > > Well -x^2 as meaning -(x^2) *is* a usual rule -- no mathematician will > ever understand it as (-x)^2. Still my question remains as whether > the above is intended by the OCaml developpers or is just a case that > "slipped through" (and an oddity that has bitten me once). Off the top of my head, I'd say this behavior wasn't intentional and is probably a mistake. I haven't checked with the Yacc grammar, though (Yacc is somewhat cranky with the precedences, and it happens that expressing the right precedences isn't obvious.) - Xavier Leroy ------------------- 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] 24+ messages in thread
* Re: [Caml-list] failwith, raise and type inference 2004-04-09 7:32 ` Xavier Leroy @ 2004-04-09 8:03 ` skaller 0 siblings, 0 replies; 24+ messages in thread From: skaller @ 2004-04-09 8:03 UTC (permalink / raw) To: Xavier Leroy; +Cc: Christophe TROESTLER, skaller, caml-list On Fri, 2004-04-09 at 17:32, Xavier Leroy wrote: > Off the top of my head, I'd say this behavior wasn't intentional and > is probably a mistake. I haven't checked with the Yacc grammar, though > (Yacc is somewhat cranky with the precedences, and it happens that > expressing the right precedences isn't obvious.) I tried and couldn't get it to work. Why use it anyhow? -- 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] 24+ messages in thread
end of thread, other threads:[~2004-04-09 8:03 UTC | newest] Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2004-04-02 13:41 [Caml-list] failwith, raise and type inference Paul Guyot 2004-04-02 13:49 ` Frederic van der Plancke 2004-04-02 13:56 ` Paul Guyot 2004-04-02 13:51 ` Nicolas Cannasse 2004-04-02 13:59 ` Correnson Loïc 2004-04-02 14:09 ` Luc Maranget 2004-04-02 19:39 ` [Caml-list] weird floating poing behavior on windows Zeno Lee 2004-04-02 20:03 ` Greg Bacon 2004-04-02 20:07 ` David Brown 2004-04-02 20:31 ` Zeno Lee 2004-04-02 20:50 ` Pierre Weis 2004-04-02 22:01 ` Brian Hurt 2004-04-02 21:58 ` Brian Hurt 2004-04-02 20:28 ` [Caml-list] failwith, raise and type inference Pierre Weis 2004-04-05 22:52 ` Ker Lutyn 2004-04-06 1:07 ` Jacques Garrigue 2004-04-06 5:23 ` Issac Trotts 2004-04-06 15:15 ` skaller 2004-04-06 1:15 ` Christophe TROESTLER 2004-04-06 7:05 ` skaller 2004-04-06 11:29 ` Eric C. Cooper 2004-04-09 7:18 ` Christophe TROESTLER 2004-04-09 7:32 ` Xavier Leroy 2004-04-09 8:03 ` skaller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox