* Re: [Caml-list] Easy solution in OCaml?
[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
0 siblings, 2 replies; 30+ messages in thread
From: Siegfried Gonzi @ 2003-04-28 12:05 UTC (permalink / raw)
To: Noel Welsh; +Cc: caml-list
Noel Welsh wrote:
>Let me just check - you don't consider Scheme to be a
>functional language?
>
I think the following nails it down:
==
Historically, Lisp was one of the first languages to accomodate a
functional programming style, and for this reason, some people still
call it a functional programming language. However, that's not correct
in a strict sense. Several paths have been followed since then, and
while languages like Miranda and Haskell were surely influenced by early
Lisp dialects, they have taken a purely functional approach. Today's
Lisp dialects, foremostly Common Lisp, don't see any problems in making
use of side effects, using iteration instead of recursion, using
object-oriented abstraction if useful for the problem at hand, and so
on. Just use the best abstraction for your current problem.
==
The above quote was pinched up from comp.lang.lisp; they had there
discussions the other day. Okay, Scheme is considerd even more
"functional" than Lisp, but the above quote is, I think, valid for
Scheme too.
Monads are not mentioned in the above quote, but I would like to stress
that Clean circumvents monadic file input-output but ensures a
functional style with no side effects! I think they were the first to
success in this way.
>
>Just about any alternative syntax would be cleaner
>than O'Caml! ;-)
>
>Noel, Scheme hacker and O'Caml lurker
>
One thing which I would like to have solved for myself:
Will my Scheme code be readable a year later ? Or would in such a case
Clean or OCaml pay off?
S. Gonzi
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-28 12:05 ` [Caml-list] Easy solution in OCaml? Siegfried Gonzi
@ 2003-04-28 13:54 ` Noel Welsh
2003-04-28 14:22 ` David Brown
1 sibling, 0 replies; 30+ messages in thread
From: Noel Welsh @ 2003-04-28 13:54 UTC (permalink / raw)
To: Siegfried Gonzi; +Cc: caml-list
--- Siegfried Gonzi <siegfried.gonzi@stud.uni-graz.at>
wrote:
> One thing which I would like to have solved for
> myself:
>
> Will my Scheme code be readable a year later ? Or
> would in such a case
> Clean or OCaml pay off?
Hasn't been a problem in the 3-4 years I've been using
Scheme. Do you use Bigloo's pattern matching macros?
I've found the PLT equivalent to greatly improve
readability.
Noel
PS: Future replies from me won't go to the O'Caml
list as this is off-topic.
=====
Email: noelwelsh <at> yahoo <dot> com
Jabber: noelw <at> jabber <dot> org
__________________________________
Do you Yahoo!?
The New Yahoo! Search - Faster. Easier. Bingo.
http://search.yahoo.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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-28 12:05 ` [Caml-list] Easy solution in OCaml? 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
1 sibling, 2 replies; 30+ messages in thread
From: David Brown @ 2003-04-28 14:22 UTC (permalink / raw)
To: Siegfried Gonzi; +Cc: Noel Welsh, caml-list
On Mon, Apr 28, 2003 at 02:05:16PM +0200, Siegfried Gonzi wrote:
> Lisp dialects, they have taken a purely functional approach. Today's
> Lisp dialects, foremostly Common Lisp, don't see any problems in making
> use of side effects, using iteration instead of recursion, using
> object-oriented abstraction if useful for the problem at hand, and so
> on. Just use the best abstraction for your current problem.
So having feature in addition to functional features disqualifies a
language from being labelled. All of the accusations given certainly
apply to Ocaml as well. Having objects and side-effects doesn't seem to
stop me from doing functional programming.
To me, the core feature of functional programming are first class
closures. Everything else just makes it more convenient.
Why someone would think using the best abstraction for your current
problem is a bad thing is beyond me. I think that is one of the
strengths of Ocaml, is that it can accomodate this so 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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-28 14:22 ` David Brown
@ 2003-04-28 14:38 ` sebastien FURIC
2003-04-28 18:14 ` Eray Ozkural
1 sibling, 0 replies; 30+ messages in thread
From: sebastien FURIC @ 2003-04-28 14:38 UTC (permalink / raw)
To: David Brown; +Cc: Siegfried Gonzi, Noel Welsh, caml-list
David Brown a écrit :
>
> On Mon, Apr 28, 2003 at 02:05:16PM +0200, Siegfried Gonzi wrote:
>
> > Lisp dialects, they have taken a purely functional approach. Today's
> > Lisp dialects, foremostly Common Lisp, don't see any problems in making
> > use of side effects, using iteration instead of recursion, using
> > object-oriented abstraction if useful for the problem at hand, and so
> > on. Just use the best abstraction for your current problem.
>
> So having feature in addition to functional features disqualifies a
> language from being labelled. All of the accusations given certainly
> apply to Ocaml as well. Having objects and side-effects doesn't seem to
> stop me from doing functional programming.
>
> To me, the core feature of functional programming are first class
> closures. Everything else just makes it more convenient.
So Smalltalk is a functional language ;-)
Maybe tail call optimisation has to be considered as a necessary
feature for a langage to qualify ?
>
> Why someone would think using the best abstraction for your current
> problem is a bad thing is beyond me. I think that is one of the
> strengths of Ocaml, is that it can accomodate this so well.
Agreed.
Cheers,
Sébastien
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
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
1 sibling, 1 reply; 30+ messages in thread
From: Eray Ozkural @ 2003-04-28 18:14 UTC (permalink / raw)
To: David Brown; +Cc: caml-list
On Monday 28 April 2003 17:22, David Brown wrote:
> To me, the core feature of functional programming are first class
> closures. Everything else just makes it more convenient.
Well said. I would also like to say here that I fail to see what distinguishes
the core of ocaml and haskell so much from a semantics point of view!!!!!!!
Both are functional languages with sequential constructs and advanced type
systems IMHO. Minus the object system, the module system of ocaml can be
viewed as a more advanced kind of "type class" in haskell (assuming we can
compare constructs inexactly!!) The really cool object system comes as a
bonus...
Being an "amateur" PL designer, I think both languages are very orthogonal but
they are both lacking the degree of parallelism that would make me think of
them as purely declarative...
There is also another point that I think is worthy of making. You can extend
ocaml rather easily using p4. I think in the future a safe and easy kind of
semantic extensibility will be the way to go, like Cardelli described in that
paper... :P
Not intended as flamery :)
Regards,
--
Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>
Comp. Sci. Dept., Bilkent University, Ankara KDE Project: http://www.kde.org
www: http://www.cs.bilkent.edu.tr/~erayo Malfunction: http://mp3.com/ariza
GPG public key fingerprint: 360C 852F 88B0 A745 F31B EA0F 7C07 AE16 874D 539C
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-28 18:14 ` Eray Ozkural
@ 2003-05-03 14:37 ` John Max Skaller
2003-05-03 16:57 ` Eray Ozkural
0 siblings, 1 reply; 30+ messages in thread
From: John Max Skaller @ 2003-05-03 14:37 UTC (permalink / raw)
To: erayo; +Cc: David Brown, caml-list
Eray Ozkural wrote:
> On Monday 28 April 2003 17:22, David Brown wrote:
>
>>To me, the core feature of functional programming are first class
>>closures. Everything else just makes it more convenient.
>>
>
> Well said. I would also like to say here that I fail to see what distinguishes
> the core of ocaml and haskell so much from a semantics point of view!!!!!!!
Laziness.
--
John Max Skaller, mailto:skaller@ozemail.com.au
snail:10/1 Toxteth Rd, Glebe, NSW 2037, Australia.
voice:61-2-9660-0850
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-05-03 14:37 ` John Max Skaller
@ 2003-05-03 16:57 ` Eray Ozkural
0 siblings, 0 replies; 30+ messages in thread
From: Eray Ozkural @ 2003-05-03 16:57 UTC (permalink / raw)
To: John Max Skaller; +Cc: David Brown, caml-list
On Saturday 03 May 2003 17:37, John Max Skaller wrote:
> Eray Ozkural wrote:
> > On Monday 28 April 2003 17:22, David Brown wrote:
> >>To me, the core feature of functional programming are first class
> >>closures. Everything else just makes it more convenient.
> >
> > Well said. I would also like to say here that I fail to see what
> > distinguishes the core of ocaml and haskell so much from a semantics
> > point of view!!!!!!!
>
> Laziness.
I know all the fluff about laziness. I wrote code that used so-called
"infinite graphs" and another code that did have higher order functions which
used monadic parameters and a lot of sequencing of monadic code if you want
to verify that. But I, as a programmer not as a lambda-calculus addict, see
laziness as an "evaluation strategy" not as a deep semantic difference. What
I meant is whether this difference is exaggerated. I think it is, and I also
think that monadic I/O is just a pretty (and burdensome) way of writing
sequential code. Something that isn't wildly interesting from a semantic POV.
Here is what I'm trying to really mean: I can write a compiler for a subset of
ocaml that uses only lazy evaluation. [*] Right or wrong?
[*] For any pure functional language I should be able to do that. Just like
Haskell compilers I don't really have to care whether the resulting code will
work reasonably or not.
--
Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>
Comp. Sci. Dept., Bilkent University, Ankara KDE Project: http://www.kde.org
www: http://www.cs.bilkent.edu.tr/~erayo Malfunction: http://mp3.com/ariza
GPG public key fingerprint: 360C 852F 88B0 A745 F31B EA0F 7C07 AE16 874D 539C
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-28 17:50 ` brogoff
2003-04-28 18:31 ` Eray Ozkural
@ 2003-04-29 6:46 ` Siegfried Gonzi
1 sibling, 0 replies; 30+ messages in thread
From: Siegfried Gonzi @ 2003-04-29 6:46 UTC (permalink / raw)
To: brogoff; +Cc: caml-list
brogoff@speakeasy.net wrote:
>
>
>Perhaps the question could go back to the Clean designers too. Why are they
>worried about two measly keywords? My evil twin suggests that it's the
>well known Dutch frugality at work. I suspect that since Clean is lazy
>and was originally a lower level language, they just didn't include it.
>
>I agree with Markus that if-then-else is nicer to read. Haskell get's this one
>right over Clean.
>
I know different strokes for different people but I do not see why
if-then should be easier to read. An excertp from a Haskell manual:
==
When many choices have to made guards
<http://www.cs.uu.nl/%7Eafie/haskell/tourofsyntax.html#Guards> can come
in handy. Instead of:
kindOfChar :: /Char -> String/
kindOfChar c =
if isLower c
then "lower"
else if isUpper c
then "upper"
else if isDigit c
then "digit"
else "other"
you can write:
kindOfChar :: /Char -> String/
kindOfChar c
| isLower c = "lower"
| isUpper c = "upper"
| isDigit c = "digit"
| otherwise = "other"
==
S. Gonzi
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-27 15:01 ` Siegfried Gonzi
2003-04-28 15:43 ` Brian Hurt
@ 2003-04-29 5:46 ` John Max Skaller
1 sibling, 0 replies; 30+ messages in thread
From: John Max Skaller @ 2003-04-29 5:46 UTC (permalink / raw)
To: Siegfried Gonzi; +Cc: Brian Hurt, Ocaml Mailing List
Siegfried Gonzi wrote:
> 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.
It depends on the kind of project AND what
you mean by "development time". I'd include
everything needed to be confident the result
was correct.
Two projects
http://interscrtipt.sf.net -- in Python
(A literate programming tool)
http://felix.sf.next -- in Ocaml
(A compiler for an algol-like language)
Interscript verges on unmaintainability.
Lightweight OO style without static typing.
Felix is relatively easy to extend despite
being considerably more complex. The implementation
is procedural at the top level with heavy use
of functional programming (mainly pure with memoisation)
for computations.
I shudder in horror at the idea of rewriting Felix
in C++. The loss of basic functional stuff like
closures and functional mapping (as well as variants)
would make a difficult project unmanageable .. and
that's just translating it, forget about new development.
SO my answer is: Ocaml provides an excellent blend of
both procedural and functional styles that make
development of moderate sized projects very efficient.
[moderate = 10K to 10M LOC]. I write small things
in Python and try to avoid C++ unless I can generate it
(despite being a member of the ISO committee standardising it).
--
John Max Skaller, mailto:skaller@ozemail.com.au
snail:10/1 Toxteth Rd, Glebe, NSW 2037, Australia.
voice:61-2-9660-0850
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-28 17:50 ` brogoff
@ 2003-04-28 18:31 ` Eray Ozkural
2003-04-29 6:46 ` Siegfried Gonzi
1 sibling, 0 replies; 30+ messages in thread
From: Eray Ozkural @ 2003-04-28 18:31 UTC (permalink / raw)
To: brogoff, caml-list
On Monday 28 April 2003 20:50, brogoff@speakeasy.net wrote:
> I agree with Markus that if-then-else is nicer to read. Haskell get's this
> one right over Clean.
What about LISP COND and WHEN?
Thanks,
--
Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>
Comp. Sci. Dept., Bilkent University, Ankara KDE Project: http://www.kde.org
www: http://www.cs.bilkent.edu.tr/~erayo Malfunction: http://mp3.com/ariza
GPG public key fingerprint: 360C 852F 88B0 A745 F31B EA0F 7C07 AE16 874D 539C
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-28 17:45 ` malc
@ 2003-04-28 18:16 ` Shivkumar Chandrasekaran
0 siblings, 0 replies; 30+ messages in thread
From: Shivkumar Chandrasekaran @ 2003-04-28 18:16 UTC (permalink / raw)
To: caml-list
Not quite, I think. How about:
(* supplied by user *)
val is_nan : 'a -> bool
val add : 'a -> 'a -> 'a
val div : 'a -> 'a -> 'a
val from_int : int -> 'a
(* that's all from the user *)
let q_means is_nan add div from_int ms = function
let sum a b c =
let filter_nan n = if is_nan n then (from_int 0) else n in
add (add (filter_nan a) (filter_nan b)) (filter_nan c)
and cardinality a b c =
let filter_nan n = if is_nan n then 0 else 1 in
from_int ((filter_nan a) + (filter_nan b) + (filter_nan c)) in
let rec qm ms = function
a :: b :: c :: rest -> div (sum a b c) (cardinality a b c) :: qm
rest
| [] -> []
| _ -> failwith "Malformed list" in
qm ms
A good test case is: [-1;-1;-1]
--shiv--
On Monday, April 28, 2003, at 10:45 AM, malc wrote:
> On Fri, 25 Apr 2003, Siegfried Gonzi wrote:
>
>> Hi:
>>
>> First off: It is not homework. I am 29 and writing my PhD in physics.
>> Often I am contemplating whether it would be possible to use OCaml in
>> combination with my beloved Bigloo to perform statistical
>> evaluations. I
>> am not sure whether there are any out there who /can/ do this
>> evaluations with OCaml what you normally would do with Matlab. The
>> problem what arises: type system and working against the compiler. In
>> Scheme changing a solution from lets say integer-array to double-array
>> is easy, but in Clean for example you would have to change all your
>> dependencies.
>> I often skim over the libraries and came to the conclusion: C, C++,
>> OCaml impossible for me to see any elegance; Clean a bit better;
>> Bigloo/Scheme: I am not sure here, because everything looks the same
>> maybe this is cheating, but I think it looks the most elegant and less
>> intimitating from all.
>>
>>
>> Rationale: given a list of 12 month. I would like to calculate the
>> quarterly means and skip any nan. Easy? Yes it is but only on paper
>> and
>> in Scheme:
>>
>> e.g: [1,2,4,-1,45,56,45,56,8]
>>
>> nan=-1.0
>>
>> result: [(1+2+3)/3, (45+56)/2, (45+56+8)/3]
>
> let nan = -1
>
> let mean a b c = (a + b + c) / 3
>
> let rec qmean = function
> a :: b :: c :: rest -> mean a b c :: qmean rest
> | [] -> []
> | otherwise -> failwith "malformed list"
>
> let _ =
> let months = [1; 2; 4; -1; 45; 56; 45; 56; 8] in
> let denan = List.map (fun x -> if x = nan then 0 else x) months in
> qmean denan
>
>
> --
> mailto:malc@pulsesoft.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
>
--shiv--
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
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
0 siblings, 2 replies; 30+ messages in thread
From: brogoff @ 2003-04-28 17:50 UTC (permalink / raw)
To: caml-list
On Mon, 28 Apr 2003, Brian Hurt wrote:
> On Mon, 28 Apr 2003 brogoff@speakeasy.net wrote:
> > But it is not "if <expr> then <expr> else <expr>", it is
> > "if <expr> <expr> <expr>" which is what people are complaining
> > about when they say there is no if-then-else in Clean.
> >
>
> They're complaining about 2 extra keywords?
Have you tried writing an if then else sequence nested at two or three
deep in both styles?
Perhaps the question could go back to the Clean designers too. Why are they
worried about two measly keywords? My evil twin suggests that it's the
well known Dutch frugality at work. I suspect that since Clean is lazy
and was originally a lower level language, they just didn't include it.
I agree with Markus that if-then-else is nicer to read. Haskell get's this one
right over Clean.
I think it's a great pity that ddr felt he had to leave, since the quarterly
OCaml syntax flame can naturally evolve into a revised discussion. Oh well...
-- 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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
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
1 sibling, 1 reply; 30+ messages in thread
From: Brian Hurt @ 2003-04-28 17:48 UTC (permalink / raw)
To: brogoff; +Cc: caml-list
On Mon, 28 Apr 2003 brogoff@speakeasy.net wrote:
> On Mon, 28 Apr 2003, isaac gouy wrote:
> > Markus Mottl wrote:
> > > I actually find it strange that there is no such
> > > thing like if-then-else in Clean.
> >
> > if-then-else is described on p35 of "Functional
> > Programming in Clean".
>
> But it is not "if <expr> then <expr> else <expr>", it is
> "if <expr> <expr> <expr>" which is what people are complaining
> about when they say there is no if-then-else in Clean.
>
They're complaining about 2 extra keywords?
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-25 6:05 Siegfried Gonzi
` (2 preceding siblings ...)
2003-04-25 16:59 ` Markus Mottl
@ 2003-04-28 17:45 ` malc
2003-04-28 18:16 ` Shivkumar Chandrasekaran
3 siblings, 1 reply; 30+ messages in thread
From: malc @ 2003-04-28 17:45 UTC (permalink / raw)
To: Siegfried Gonzi; +Cc: caml-list
On Fri, 25 Apr 2003, Siegfried Gonzi wrote:
> Hi:
>
> First off: It is not homework. I am 29 and writing my PhD in physics.
> Often I am contemplating whether it would be possible to use OCaml in
> combination with my beloved Bigloo to perform statistical evaluations. I
> am not sure whether there are any out there who /can/ do this
> evaluations with OCaml what you normally would do with Matlab. The
> problem what arises: type system and working against the compiler. In
> Scheme changing a solution from lets say integer-array to double-array
> is easy, but in Clean for example you would have to change all your
> dependencies.
> I often skim over the libraries and came to the conclusion: C, C++,
> OCaml impossible for me to see any elegance; Clean a bit better;
> Bigloo/Scheme: I am not sure here, because everything looks the same
> maybe this is cheating, but I think it looks the most elegant and less
> intimitating from all.
>
>
> Rationale: given a list of 12 month. I would like to calculate the
> quarterly means and skip any nan. Easy? Yes it is but only on paper and
> in Scheme:
>
> e.g: [1,2,4,-1,45,56,45,56,8]
>
> nan=-1.0
>
> result: [(1+2+3)/3, (45+56)/2, (45+56+8)/3]
let nan = -1
let mean a b c = (a + b + c) / 3
let rec qmean = function
a :: b :: c :: rest -> mean a b c :: qmean rest
| [] -> []
| otherwise -> failwith "malformed list"
let _ =
let months = [1; 2; 4; -1; 45; 56; 45; 56; 8] in
let denan = List.map (fun x -> if x = nan then 0 else x) months in
qmean denan
--
mailto:malc@pulsesoft.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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-28 16:38 ` brogoff
@ 2003-04-28 17:13 ` isaac gouy
2003-04-28 17:48 ` Brian Hurt
1 sibling, 0 replies; 30+ messages in thread
From: isaac gouy @ 2003-04-28 17:13 UTC (permalink / raw)
To: brogoff, caml-list
Thanks for correcting my misunderstanding ;-)
> But it is not "if <expr> then <expr> else <expr>",
> it is
> "if <expr> <expr> <expr>" which is what people are
> complaining
> about when they say there is no if-then-else in
> Clean.
__________________________________
Do you Yahoo!?
The New Yahoo! Search - Faster. Easier. Bingo.
http://search.yahoo.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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
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
0 siblings, 2 replies; 30+ messages in thread
From: brogoff @ 2003-04-28 16:38 UTC (permalink / raw)
To: caml-list
On Mon, 28 Apr 2003, isaac gouy wrote:
> Markus Mottl wrote:
> > I actually find it strange that there is no such
> > thing like if-then-else in Clean.
>
> if-then-else is described on p35 of "Functional
> Programming in Clean".
But it is not "if <expr> then <expr> else <expr>", it is
"if <expr> <expr> <expr>" which is what people are complaining
about when they say there is no if-then-else in Clean.
-- 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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-27 15:01 ` Siegfried Gonzi
@ 2003-04-28 15:43 ` Brian Hurt
2003-04-29 5:46 ` John Max Skaller
1 sibling, 0 replies; 30+ messages in thread
From: Brian Hurt @ 2003-04-28 15:43 UTC (permalink / raw)
To: Siegfried Gonzi; +Cc: Brian Hurt, Ocaml Mailing List
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
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
@ 2003-04-28 15:27 isaac gouy
2003-04-28 16:38 ` brogoff
0 siblings, 1 reply; 30+ messages in thread
From: isaac gouy @ 2003-04-28 15:27 UTC (permalink / raw)
To: caml-list
As-far-as-I-can-tell the current version, Clean 2.0.2,
seems to be more capable than whichever version of
Clean is being discussed here-
Siegfried Gonzi wrote:
> Clean or OCaml where you would have to re-write all
> your functions because the structure of your
> return-list has changed
Existential Types in Clean 2.0.2 seem designed to deal
with exactly this issue?
Page 92 of "Functional Programming in Clean".
Markus Mottl wrote:
> I actually find it strange that there is no such
> thing like if-then-else in Clean.
if-then-else is described on p35 of "Functional
Programming in Clean".
Available from
http://www.cs.kun.nl/~clean/contents/Clean_Book/clean_book.html
best wishes, Isaac
__________________________________
Do you Yahoo!?
The New Yahoo! Search - Faster. Easier. Bingo.
http://search.yahoo.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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-27 16:54 ` Eray Ozkural
@ 2003-04-28 5:00 ` Siegfried Gonzi
0 siblings, 0 replies; 30+ messages in thread
From: Siegfried Gonzi @ 2003-04-28 5:00 UTC (permalink / raw)
To: erayo; +Cc: Markus Mottl, caml-list
>
>
>
>Eray Ozkural wrote:
>
>On Sunday 27 April 2003 17:13, Siegfried Gonzi wrote:
>
>>quarter:: [Real] Real -> [Real]
>>quarter ls nan = sum_it 0 0.0 0 ls []
>>where
>>
>
>Ah! Why don't we have "where" in ocaml? I really miss it!
>
>Thanks,
>
Hi guys:
I diged out my old Clean manuals and tried everything starting from
foldr, list-comprehension, function composition (f o g o g), but I did
fail and my general solution is as follows:
==
module stat
import StdEnv
meanFromList:: [Real] Real -> Real
meanFromList ls nan
# ls_nan = filter ((<) nan) ls
# n = length(ls_nan)
| n > 0 = sum(ls_nan)/toReal(n)
| otherwise = nan
qMeans:: [Real] Real Int -> [Real]
qMeans [] nan q = []
qMeans ls nan q = [(meanFromList (take q ls) nan):(qMeans (drop q ls)
nan q)]
Start = qMeans [toReal(x) \\ x<-[1..100]] (-1.0) 2
==
The solution needs the following Clean standard functions: filter,
length, sum, take and drop.
The overhead of take and drop is negligible.
Regards,
S. Gonzi
PS: Or if you like where:
==
qMeans:: [Real] Real Int -> [Real]
qMeans [] nan q = []
qMeans ls nan q = [(meanFromList (take q ls) nan):(qMeans (drop q ls)
nan q)]
where
meanFromList:: [Real] Real -> Real
meanFromList ls nan
# ls_nan = filter ((<) nan) ls
# n = length(ls_nan)
| n > 0 = sum(ls_nan)/toReal(n)
| otherwise = nan
==
>
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-27 14:13 ` Siegfried Gonzi
@ 2003-04-27 16:54 ` Eray Ozkural
2003-04-28 5:00 ` Siegfried Gonzi
0 siblings, 1 reply; 30+ messages in thread
From: Eray Ozkural @ 2003-04-27 16:54 UTC (permalink / raw)
To: Siegfried Gonzi, Markus Mottl; +Cc: caml-list
On Sunday 27 April 2003 17:13, Siegfried Gonzi wrote:
> quarter:: [Real] Real -> [Real]
> quarter ls nan = sum_it 0 0.0 0 ls []
> where
Ah! Why don't we have "where" in ocaml? I really miss it!
Thanks,
--
Eray Ozkural (exa) <erayo@cs.bilkent.edu.tr>
Comp. Sci. Dept., Bilkent University, Ankara KDE Project: http://www.kde.org
www: http://www.cs.bilkent.edu.tr/~erayo Malfunction: http://mp3.com/ariza
GPG public key fingerprint: 360C 852F 88B0 A745 F31B EA0F 7C07 AE16 874D 539C
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-26 21:51 ` Brian Hurt
@ 2003-04-27 15:01 ` Siegfried Gonzi
2003-04-28 15:43 ` Brian Hurt
2003-04-29 5:46 ` John Max Skaller
0 siblings, 2 replies; 30+ messages in thread
From: Siegfried Gonzi @ 2003-04-27 15:01 UTC (permalink / raw)
To: Brian Hurt; +Cc: Ocaml Mailing List
>
>
>Brian Hurt wrote:
>
>
>If you don't know what you just pulled out of a list, how can you do
>anything with it? About all you can do with it is to move it around.
>Take it out of one data structure and put it into another. Or pass it to
>some other function. Which you can quite happily do with Ocaml- take a
>look at List.map or Array.of_list in the standard libraries for examples.
>
>But once you want to do something more with the elements than just move
>them around, you need to know what they are- what type they are. So let's
>say I'm expecting that I'm dealing with an int list list (your first
>example there). I could easily convert this to a float list list by
>doing:
>
>let conv lst = List.map (fun l -> List.map (float_of_int) l) lst
>
>With some suitable generic handling, instead of calling List.map, I just
>call map, so when I hit an array of ints instead of a list of ints, I call
>Array.map and not List.map. It could be done, it'd be of limited use but
>it could be done. But what am I supposed to do with the string "hi guy"?
>Should it treat the string as a list of char, implicitly convert it to a
>list of int, and then convert the list of int to a list of float,
>returning [104.; 105.; 32.; 103.; 117.; 121.]? What sensible thing can
>you do here?
>
>This is what I meant about a bug in your program or not thinking the
>design through. If there is a reason you're putting a string into that
>list, it means something. Decide what it means, and at each point you
>handle elements from that list, decide what to do if you see a string-
>even if it's just "ignore it and go on", think about it and decide.
>
Before I commence I have to say: there exists actually only 2 functional
languages which deserve to be used by industry: this is OCaml and
Haskell. Okay, in the Scheme realm only Bigloo (and mybe PLT Scheme)
stands for "ready for industry". But I have to say that Clean's elegant
syntax is way, way, way above OCaml ones.
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.
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.
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.
Regards,
S. Gonzi
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-25 16:59 ` Markus Mottl
2003-04-26 6:25 ` Siegfried Gonzi
@ 2003-04-27 14:13 ` Siegfried Gonzi
2003-04-27 16:54 ` Eray Ozkural
1 sibling, 1 reply; 30+ messages in thread
From: Siegfried Gonzi @ 2003-04-27 14:13 UTC (permalink / raw)
To: Markus Mottl; +Cc: caml-list
>
>
>
>Markus Mottl wrote:
>
>>
>
>Or in OCaml, if you know how to do it elegantly and reasonably efficiently:
>
> let coll (len, sum as acc) n = if n >= 0 then len + 1, sum + n else acc
>
> let qmeans =
> let rec loop acc = function
> | a :: b :: c :: t ->
> let len, sum = coll (coll (coll (0, 0) a) b) c in
> loop ((if len = 0 then 0.0 else float sum /. float len) :: acc) t
> | [] -> List.rev acc
> | _ -> failwith "qmeans: illegal list" in
> loop []
>
As comparison I post my Clean version (it is more general or could be
made general, lets say for a list with 24 hours). But I am still not
contended, because why isn't it possible to use more elegant
"functional-constructs" which lead to short, easy to read and easy to
comprehend solutions (see also my post on comp.lang.functional):
==
module stat
import StdEnv
quarter:: [Real] Real -> [Real]
quarter ls nan = sum_it 0 0.0 0 ls []
where
sum_it:: Int Real Int [Real] [Real] -> [Real]
sum_it counter sum n [] erg = reverse erg
sum_it counter sum n [h:t] erg
| (counter == 2)
| n > 0 = sum_it 0 0.0 0 t [(sum/toReal(n)):erg]
= sum_it 0 0.0 0 t [nan:erg]
| h > nan = sum_it (counter+1) (sum+h) (n+1) t erg
| otherwise = sum_it (counter+1) sum n t erg
Start = quarter [1.0,2.0,-1.0,3.4,3.4,-1.0,-1.0,2.3,3.4,-1.0,-1.0,-1.0] (-1.0)
==
Regards,
S. Gonzi
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-26 13:45 ` Siegfried Gonzi
@ 2003-04-26 21:51 ` Brian Hurt
2003-04-27 15:01 ` Siegfried Gonzi
0 siblings, 1 reply; 30+ messages in thread
From: Brian Hurt @ 2003-04-26 21:51 UTC (permalink / raw)
To: Siegfried Gonzi; +Cc: Brian Hurt, Ocaml Mailing List
On Sat, 26 Apr 2003, Siegfried Gonzi wrote:
> >I find that if you're working against the compiler, either a) you haven't
> >thought the problem through, b) there's an easy solution you're missing,
> >or c) you have a bug.
> >
>
> I think this is a very interesting question. What I love about Scheme
> (or even Python lists) is the fact that you can put into a list what you
> want. I had a problem the other day which was as follows:
>
> I have a Scheme function which extracts floating-point values from
> strings located in a file:
>
> ==
> 12.33,43.4,4.56,nan,1.23
> 23.3,34.4,nan,1.2,0
> ...
> ==
>
> The extracted floating point numbers become stored into an array:
>
> (vector (vector 12.33 43.4 4.56 -1.0 1.23) (vector 23.3 34.4 -1.0 1.2 0.0))
>
> My boss gave me a file which he urgently had to evaluate in order to
> fullfill a time schedule (some measurements from the field of
> experimental physics). But there was a problem, because the file was as
> follows:
>
> ==
> name1,2.23,2.23,23.4
> name2,23.34,23.34,.223
> ...
> ==
>
> The first entry was an annotation but my Scheme function expects a
> string which can be converted to a floating point number. But Scheme is
> your friend here, because one more line in my file-reading function and
> you get something like this:
>
> ((name1 2.23 2.334) (name2 3.34 23.2 ...))
>
> In Ocaml I would have to skip the first entry because it is not a
> floating-point value. All my other functions were not affected, because
> passing around arrays or lists does not mean you must put forward
> floating-points or string arrays or whatever.
You have to skip the first entry anyways, because it's not a floating
point value. Or you have to have special handling for strings and floats
seperately- every time you pull an element out of the list, you need to go
"is this a string or a float?" and handle it correctly. Otherwise, please
define what "name1" /. 3.0 should be.
How you put strings and floats into the same list is you define a type,
call it foo_t for the moment:
type foo_t =
String of string
| Float of float
;;
And make it a list of foo_t's. You can now pick apart your list by, for
example:
let print_list lst =
let rec loop lst =
match lst with
[] -> () (* End the recursion *)
| String(s) :: t ->
print_string (s ^ " ");
loop t
| Float(x) :: t ->
print_string ((string_of_float x) ^ " ");
loop t
in
print_string "( ";
loop lst;
print_string ")\n"
Now, let's say at a later point you want integers in your string as well,
so you extend foo_t to be:
type foo_t =
String of string
| Float of float
| Int of int
;;
But being a forgetfull sort (like I am all the time), you forget to update
print_string. The next time you try to compile, ocaml tells you:
File "temp.ml", line 10, characters 8-274:
Warning: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
Int _::_
You constantly see (or at least I constantly see) the same pattern
repeated over and over- pulling an Object out of a data structure and then
running it through a tree of if typeofs to figure out what sort of
creature you just pulled out. And when you add a new type to the
structure, all those if trees need a new branch. In Ocaml, you can do the
same thing, but the compiler checks your work and warns you if you forgot
a place.
If the string is always just the first element, you might consider using a
tuple or structure. But the short form is, you have a problem. And one
the language shouldn't just let you sweep under the rug, as we'll see.
>
> I agree upon that the above feature can sometimes lead to bad hacks,
> because you the return value of a function can consist of a list where
> you put things into the list which you decide later on whether you want
> augment the list by other parameters, for example:
>
> Your first version of the function has as return value: (list (list 2 3 4))
>
> A year later you decide you want something like this: (list (list 2 3 4)
> (vector 3 4 5) "hi guy")
>
> The goody here is all your other functions which expect the output of
> the above function must not be re-written, as opposed to Clean or OCaml
> where you would have to re-write all your functions because the
> structure of your return-list has changed.
If you don't know what you just pulled out of a list, how can you do
anything with it? About all you can do with it is to move it around.
Take it out of one data structure and put it into another. Or pass it to
some other function. Which you can quite happily do with Ocaml- take a
look at List.map or Array.of_list in the standard libraries for examples.
But once you want to do something more with the elements than just move
them around, you need to know what they are- what type they are. So let's
say I'm expecting that I'm dealing with an int list list (your first
example there). I could easily convert this to a float list list by
doing:
let conv lst = List.map (fun l -> List.map (float_of_int) l) lst
With some suitable generic handling, instead of calling List.map, I just
call map, so when I hit an array of ints instead of a list of ints, I call
Array.map and not List.map. It could be done, it'd be of limited use but
it could be done. But what am I supposed to do with the string "hi guy"?
Should it treat the string as a list of char, implicitly convert it to a
list of int, and then convert the list of int to a list of float,
returning [104.; 105.; 32.; 103.; 117.; 121.]? What sensible thing can
you do here?
This is what I meant about a bug in your program or not thinking the
design through. If there is a reason you're putting a string into that
list, it means something. Decide what it means, and at each point you
handle elements from that list, decide what to do if you see a string-
even if it's just "ignore it and go on", think about it and decide.
>
> >This is usefull for two reasons, in my experience: sometimes, it lets the
> >compiler produce better code (for example, consider the function:
> >let foo x y = x == y
> >If you know that x and y will always be integers, doing:
> >let foo (x:int) (y:int) = x == y
> >allows the compiler to inline integer equals, rather than calling the
> >generic compare function- much faster).
> >
> I doubt that type correctness is always better or leads to failure-free
> program execution.
Type correctness is not a panacea- bugs can still sneak past. Not even
proofs of code correctness is good enough- they just prove the code does
what it's designed to do, not what it's *supposed* to do. Unfortunately,
no CPU architecture I know of includes a DWIM instruction (despite long
standing and unremitting demand)...
Type correctness does catch a lot of bugs, often even surprisingly deep
bugs. And every bug the compiler catches is one less you have to hunt
down yourself...
> Yesterday I faced the following situation: dividing
> the two vectors:
>
> (vector 0.0 0.0 23.34 23.4)
> through
> (vector 0.0 0.0 0.0 23.4)
>
> I forgot to check that division by zero is not a good idea, but the good
> old Bigloo compiler didn't rebel and had as output:
>
> (vector #f #f #f 1.0)
>
> Maybe a bad example because in OCaml you could use exceptions or
> something like this, but in this case the OCaml program had aborted
> (this is also true for C,...). I am not sure how long it would have gone
> good, but the Scheme program had not aborted in a safety-critical
> system-environment. I am really often surprised how forgiving Scheme and
> also CommonLisp actually are in such situations.
Hmm? What platform are you on? Linux on x86:
$ ocaml
Objective Caml version 3.06
# 1. /. 0. ;;
- : float = inf.
# 0. /. 0. ;;
- : float = nan.
# 0. /. 1. ;;
- : float = 0.
# let x = [ 0.0 ; 1.0 ; 0.0 ; 1.0 ]
and y = [ 0.0 ; 0.0 ; 1.0 ; 1.0 ] ;;
val x : float list = [0.; 1.; 0.; 1.]
val y : float list = [0.; 0.; 1.; 1.]
# let rec vdiv a b =
match a, b with
[], [] -> []
| x :: at, y :: bt -> (x /. y) :: (vdiv at bt)
| _ -> assert false
;;
val vdiv : float list -> float list -> float list = <fun>
# vdiv x y ;;
- : float list = [nan.; inf.; 0.; 1.]
#
No exceptions for me.
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
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
1 sibling, 1 reply; 30+ messages in thread
From: Siegfried Gonzi @ 2003-04-26 13:45 UTC (permalink / raw)
To: Brian Hurt; +Cc: caml-list
>
>
>
>
Brian Hurt wrote:
>I find that if you're working against the compiler, either a) you haven't
>thought the problem through, b) there's an easy solution you're missing,
>or c) you have a bug.
>
I think this is a very interesting question. What I love about Scheme
(or even Python lists) is the fact that you can put into a list what you
want. I had a problem the other day which was as follows:
I have a Scheme function which extracts floating-point values from
strings located in a file:
==
12.33,43.4,4.56,nan,1.23
23.3,34.4,nan,1.2,0
...
==
The extracted floating point numbers become stored into an array:
(vector (vector 12.33 43.4 4.56 -1.0 1.23) (vector 23.3 34.4 -1.0 1.2 0.0))
My boss gave me a file which he urgently had to evaluate in order to
fullfill a time schedule (some measurements from the field of
experimental physics). But there was a problem, because the file was as
follows:
==
name1,2.23,2.23,23.4
name2,23.34,23.34,.223
...
==
The first entry was an annotation but my Scheme function expects a
string which can be converted to a floating point number. But Scheme is
your friend here, because one more line in my file-reading function and
you get something like this:
((name1 2.23 2.334) (name2 3.34 23.2 ...))
In Ocaml I would have to skip the first entry because it is not a
floating-point value. All my other functions were not affected, because
passing around arrays or lists does not mean you must put forward
floating-points or string arrays or whatever.
I agree upon that the above feature can sometimes lead to bad hacks,
because you the return value of a function can consist of a list where
you put things into the list which you decide later on whether you want
augment the list by other parameters, for example:
Your first version of the function has as return value: (list (list 2 3 4))
A year later you decide you want something like this: (list (list 2 3 4)
(vector 3 4 5) "hi guy")
The goody here is all your other functions which expect the output of
the above function must not be re-written, as opposed to Clean or OCaml
where you would have to re-write all your functions because the
structure of your return-list has changed.
>This is usefull for two reasons, in my experience: sometimes, it lets the
>compiler produce better code (for example, consider the function:
>let foo x y = x == y
>If you know that x and y will always be integers, doing:
>let foo (x:int) (y:int) = x == y
>allows the compiler to inline integer equals, rather than calling the
>generic compare function- much faster).
>
I doubt that type correctness is always better or leads to failure-free
program execution. Yesterday I faced the following situation: dividing
the two vectors:
(vector 0.0 0.0 23.34 23.4)
through
(vector 0.0 0.0 0.0 23.4)
I forgot to check that division by zero is not a good idea, but the good
old Bigloo compiler didn't rebel and had as output:
(vector #f #f #f 1.0)
Maybe a bad example because in OCaml you could use exceptions or
something like this, but in this case the OCaml program had aborted
(this is also true for C,...). I am not sure how long it would have gone
good, but the Scheme program had not aborted in a safety-critical
system-environment. I am really often surprised how forgiving Scheme and
also CommonLisp actually are in such situations.
Regards,
S. Gonzi
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-25 16:59 ` Markus Mottl
@ 2003-04-26 6:25 ` Siegfried Gonzi
2003-04-27 14:13 ` Siegfried Gonzi
1 sibling, 0 replies; 30+ messages in thread
From: Siegfried Gonzi @ 2003-04-26 6:25 UTC (permalink / raw)
To: Markus Mottl; +Cc: caml-list
Markus Mottl wrote:
>
>
>>- why if-then constructs? I think this was called "guards" in Clean?
>>
>
>I actually find it strange that there is no such thing like if-then-else
>in Clean. OCaml also supports guards, but they are not always best style.
>
Hi:
Thanks for your answer. My Clean is a bit outdated but I am sure if-else
exists in Clean too. But I agree you would have to dig out a deep hole
in order to encounter if-then in the Clean manual.
I am not sure why, but I find if-then disturbing in OCaml.
Regards,
S. Gonzi
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
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:59 ` Markus Mottl
2003-04-26 6:25 ` Siegfried Gonzi
2003-04-27 14:13 ` Siegfried Gonzi
2003-04-28 17:45 ` malc
3 siblings, 2 replies; 30+ messages in thread
From: Markus Mottl @ 2003-04-25 16:59 UTC (permalink / raw)
To: Siegfried Gonzi; +Cc: caml-list
Siegfried Gonzi schrieb am Freitag, den 25. April 2003:
> Often I am contemplating whether it would be possible to use
> OCaml in combination with my beloved Bigloo to perform statistical
> evaluations. I am not sure whether there are any out there who /can/
> do this evaluations with OCaml what you normally would do with Matlab.
For heavy duty statistics you better use tailor-made libraries, e.g. the
OCaml-interface to the GSL (Gnu Scientific Library) OCaml-GSL:
http://oandrieu.nerim.net/ocaml/gsl/
possibly in combination with other linear algebra libraries, e.g. LACAML:
http://www.oefai.at/~markus/home/ocaml_sources.html#LACAML
This should give you top-performance on really large data.
> The problem what arises: type system and working against the compiler.
Mandatory rule for OCaml-beginners: NEVER try to work against the
compiler. The compiler is your friend.
> Rationale: given a list of 12 month. I would like to calculate the
> quarterly means and skip any nan. Easy? Yes it is but only on paper and
> in Scheme:
Or in OCaml, if you know how to do it elegantly and reasonably efficiently:
let coll (len, sum as acc) n = if n >= 0 then len + 1, sum + n else acc
let qmeans =
let rec loop acc = function
| a :: b :: c :: t ->
let len, sum = coll (coll (coll (0, 0) a) b) c in
loop ((if len = 0 then 0.0 else float sum /. float len) :: acc) t
| [] -> List.rev acc
| _ -> failwith "qmeans: illegal list" in
loop []
> In Scheme I wrote it as functional as possible, but I fail to do this in
> Ocaml. I mean doing it in OCaml via loops would be straightforward, but
> I didn't succeed in coming up with a solution of:
>
> - relies on pattern matching?
Yes, you have to match the list.
> - is short and and shouldn't resemble imperative style
See above.
> - why if-then constructs? I think this was called "guards" in Clean?
I actually find it strange that there is no such thing like if-then-else
in Clean. OCaml also supports guards, but they are not always best style.
> - why begin-end constructs? In Scheme begin-end constructs are ordinary,
> but I find it irritating to use it in OCaml.
You can use parentheses instead.
> - is it possible to give type information for readbility.
Yes, e.g.:
let qmeans : int list -> float list = ...
Regards,
Markus Mottl
--
Markus Mottl http://www.oefai.at/~markus markus@oefai.at
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-25 15:46 ` Brian Hurt
@ 2003-04-25 16:34 ` Ville-Pertti Keinonen
2003-04-26 13:45 ` Siegfried Gonzi
1 sibling, 0 replies; 30+ messages in thread
From: Ville-Pertti Keinonen @ 2003-04-25 16:34 UTC (permalink / raw)
To: Brian Hurt; +Cc: Siegfried Gonzi, caml-list
On Friday, Apr 25, 2003, at 18:46 Europe/Helsinki, Brian Hurt wrote:
> This is usefull for two reasons, in my experience: sometimes, it lets
> the
> compiler produce better code (for example, consider the function:
> let foo x y = x == y
> If you know that x and y will always be integers, doing:
> let foo (x:int) (y:int) = x == y
> allows the compiler to inline integer equals, rather than calling the
> generic compare function- much faster).
Actually, this is not true for your example, since you're comparing
physical equality. Comparing physical equality (==, !=) is always
efficient. Structural equality (=, <>) and order (>, >=, <, <=) will
require calls to generic functions for unknown or indirect types.
This is equivalent to eq? vs. equal? in Scheme, but there is no
non-traversing middle case similar to eqv?.
-------------------
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
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-25 16:59 ` Markus Mottl
2003-04-28 17:45 ` malc
3 siblings, 2 replies; 30+ messages in thread
From: Brian Hurt @ 2003-04-25 15:46 UTC (permalink / raw)
To: Siegfried Gonzi; +Cc: caml-list
On Fri, 25 Apr 2003, Siegfried Gonzi wrote:
> Hi:
>
> First off: It is not homework. I am 29 and writing my PhD in physics.
> Often I am contemplating whether it would be possible to use OCaml in
> combination with my beloved Bigloo to perform statistical evaluations. I
> am not sure whether there are any out there who /can/ do this
> evaluations with OCaml what you normally would do with Matlab. The
> problem what arises: type system and working against the compiler. In
> Scheme changing a solution from lets say integer-array to double-array
> is easy, but in Clean for example you would have to change all your
> dependencies.
I find that if you're working against the compiler, either a) you haven't
thought the problem through, b) there's an easy solution you're missing,
or c) you have a bug.
Converting, at run time, from a list of ints to a list of floats is
trivial in Ocaml: just do:
let convert_int_list_to_float_list = List.map float_of_int ;;
A similiar function for arrays using Array.map is easy as well. Note that
at run time, you have to go through and transform each element (that's
what List.map does). You have to do this in any language, because to the
machine floats are not ints. Some languages just hide this from you, but
you have to do it sooner or later anyways.
> I often skim over the libraries and came to the conclusion: C, C++,
> OCaml impossible for me to see any elegance; Clean a bit better;
> Bigloo/Scheme: I am not sure here, because everything looks the same
> maybe this is cheating, but I think it looks the most elegant and less
> intimitating from all.
>
One man's elegance is another man's ugliness. Got to agree with you about
the C and C++ libraries, though.
>
> Rationale: given a list of 12 month. I would like to calculate the
> quarterly means and skip any nan. Easy? Yes it is but only on paper and
> in Scheme:
>
> e.g: [1,2,4,-1,45,56,45,56,8]
>
> nan=-1.0
>
> result: [(1+2+3)/3, (45+56)/2, (45+56+8)/3]
let rec sum3 lst =
match lst with
[] -> []
| a :: b :: c :: t ->
let s = (if a >= 0 then a else 0) +
(if b >= 0 then b else 0) +
(if c >= 0 then c else 0)
and k = (if a >= 0 then 1 else 0) +
(if b >= 0 then 1 else 0) +
(if c >= 0 then 1 else 0)
in
(* Since we're only dealing with 12 months, it's OK not to
be tail recursive *)
(s/k) :: (sum3 t)
| _ -> assert false (* list is not a multiple of 3 in length *)
Or you could use List.fold_left and an internal function. Which has the
advantage of being parameterizable:
let sumN numElems lst =
let foldfunc = fun (accum, sum, cnt, tot) elem ->
if (elem >= 0) then
if (cnt == numElems) then
if (tot == 0) then
( ( 0 :: accum ), elem, 1, 1 )
else
( ( (sum/tot) :: accum ), elem, 1, 1)
else
( accum, sum + elem, cnt + 1, tot + 1 )
else
if (cnt == numElems) then
if (tot == 0) then
( ( 0 :: accum ), 0, 1, 0 )
else
( ( (sum/tot) :: accum ), 0, 1, 0)
else
( accum, sum, cnt + 1, tot )
in
let res = List.fold_left foldfunc ([], 0, 0, 0) lst
in
match res with
(accum, sum, cnt, tot) ->
if (tot > 0) then
List.rev ( (sum/tot) :: accum )
else
List.rev ( 0 :: accum )
;;
> - why if-then constructs? I think this was called "guards" in Clean? Can
> I use block-structure instead? I hate blocks ala Python but never mind
> to use it in Clean's way.
Gaurds can be used in Ocaml as well- at least, we have something called
(IIRC) gaurds, used in pattern matching.
> - why begin-end constructs? In Scheme begin-end constructs are ordinary,
> but I find it irritating to use it in OCaml.
Begin/end are generally only used to solve shift/reduce conflicts to
reduce (dangling elses, and in a few other places).
> - is it possible to give type information for readbility. In Clean I
> often wroten upon entry of the function:
Yep. You can either give type information peicemeal, using parens, like:
let sum (x : int) (y : float) = x + (int_of_float y)
(which says foo takes two parameters- an int and a float), or for the
whole function:
let sum : int -> float -> int = fun x y -> x + (int_of_float y)
This is usefull for two reasons, in my experience: sometimes, it lets the
compiler produce better code (for example, consider the function:
let foo x y = x == y
If you know that x and y will always be integers, doing:
let foo (x:int) (y:int) = x == y
allows the compiler to inline integer equals, rather than calling the
generic compare function- much faster).
The other use is to nail down annoying type errors. This lets you tell
the compiler what type something *should* be, and then see where the type
errors occur. But generally, you can just let type inference do it's job,
for example:
let sum x y = x + (int_of_float y)
gets the right type inferred without effort.
Hope this helps.
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] 30+ messages in thread
* Re: [Caml-list] Easy solution in OCaml?
2003-04-25 6:05 Siegfried Gonzi
@ 2003-04-25 8:19 ` sebastien FURIC
2003-04-25 15:46 ` Brian Hurt
` (2 subsequent siblings)
3 siblings, 0 replies; 30+ messages in thread
From: sebastien FURIC @ 2003-04-25 8:19 UTC (permalink / raw)
To: Siegfried Gonzi; +Cc: OCaml Mailing list
Hi Siegfried,
I wrote the following Ocaml program that performs the task using
functors.
The "interresting stuff" is in module Means: It computes the means
given rules you define into the NUMERICTYPE module you pass to the
functor. As you can see, there is no need to change the code even if you
change your numeric type or the meaning of is_nan, zero, one, + and /.
module type NUMERICTYPE =
sig
type t
val is_nan: t -> bool
val zero: t
val one: t
val ( + ): t -> t -> t
val ( / ): t -> t -> t
end
module type MEANS =
sig
type t
val quarterly_means: t list -> t * t * t * t
end
module Means(NumericType : NUMERICTYPE) : (MEANS with type t =
NumericType.t) =
struct
open NumericType
type t = NumericType.t
let mean xs =
let rec mean' sum n = function
| [] -> sum / n
| x :: xs when is_nan x -> mean' sum n xs
| x :: xs -> mean' (sum + x) (n + one) xs
in mean' zero zero xs
let quarterly_means = function
| [a; b; c; d; e; f; g; h; i; j; k; l] ->
mean [a; b; c], mean [d; e; f], mean [g; h; i], mean [j; k; l]
| _ -> failwith "quarterly_means: 12 months expected"
end
(* tests *)
module Integer =
struct
type t = int
let is_nan i = i = -1
let zero = 0
let one = 1
let ( + ) = ( + )
let ( / ) = ( / )
end
;;
module Float =
struct
type t = float
let is_nan f = classify_float f = FP_nan
let zero = 0.0
let one = 1.0
let ( + ) = ( +. )
let ( / ) = ( /. )
end
;;
module MeansInteger = Means(Integer);;
MeansInteger.quarterly_means
[1; 2; 4; -1; 45; 56; 45; 56; 8; 10; 30; 5];;
module MeansFloat = Means(Float);;
MeansFloat.quarterly_means
[1.0; 2.0; 4.0; 0.0 /. 0.0; 45.0; 56.0; 45.0; 56.0; 8.0; 10.0; 30.0;
5.0];;
Cheers,
Sébastien.
-------------------
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] 30+ messages in thread
* [Caml-list] Easy solution in OCaml?
@ 2003-04-25 6:05 Siegfried Gonzi
2003-04-25 8:19 ` sebastien FURIC
` (3 more replies)
0 siblings, 4 replies; 30+ messages in thread
From: Siegfried Gonzi @ 2003-04-25 6:05 UTC (permalink / raw)
To: caml-list
Hi:
First off: It is not homework. I am 29 and writing my PhD in physics.
Often I am contemplating whether it would be possible to use OCaml in
combination with my beloved Bigloo to perform statistical evaluations. I
am not sure whether there are any out there who /can/ do this
evaluations with OCaml what you normally would do with Matlab. The
problem what arises: type system and working against the compiler. In
Scheme changing a solution from lets say integer-array to double-array
is easy, but in Clean for example you would have to change all your
dependencies.
I often skim over the libraries and came to the conclusion: C, C++,
OCaml impossible for me to see any elegance; Clean a bit better;
Bigloo/Scheme: I am not sure here, because everything looks the same
maybe this is cheating, but I think it looks the most elegant and less
intimitating from all.
Rationale: given a list of 12 month. I would like to calculate the
quarterly means and skip any nan. Easy? Yes it is but only on paper and
in Scheme:
e.g: [1,2,4,-1,45,56,45,56,8]
nan=-1.0
result: [(1+2+3)/3, (45+56)/2, (45+56+8)/3]
I wrote a program in Scheme in order to perform the aformentioned task.
In Scheme I wrote it as functional as possible, but I fail to do this in
Ocaml. I mean doing it in OCaml via loops would be straightforward, but
I didn't succeed in coming up with a solution of:
- relies on pattern matching?
- is short and and shouldn't resemble imperative style
Currently I do not have Clean installed, but I think I would have no
problems to do the above requirement in Clean. I find the following
irritating in OCaml:
- why if-then constructs? I think this was called "guards" in Clean? Can
I use block-structure instead? I hate blocks ala Python but never mind
to use it in Clean's way.
- why begin-end constructs? In Scheme begin-end constructs are ordinary,
but I find it irritating to use it in OCaml.
- is it possible to give type information for readbility. In Clean I
often wroten upon entry of the function:
sum:: Int Real -> Int
sum a b = ...
The above is not provocating. I learn best when I see how other would
solve it in an /elegant functional way/.
Regards,
S. Gonzi
-------------------
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] 30+ messages in thread
end of thread, other threads:[~2003-05-03 16:58 UTC | newest]
Thread overview: 30+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20030427164326.34082.qmail@web41211.mail.yahoo.com>
2003-04-28 12:05 ` [Caml-list] Easy solution in OCaml? 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
-- strict thread matches above, loose matches on Subject: below --
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
2003-04-29 5:46 ` John Max Skaller
2003-04-25 16:59 ` 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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox