As a fine example of the kind of Yak Shaving that I tend to indulge in, I've studied a lot of Haskell over the last few days. It's a really rather pleasant functional language. I picked up a book for it a while ago, the first time I thought about looking at Relax NG, when I noticed that James Clark had written examples of the validation algorithm in it.
So naturally, the book has sat on my shelves for the best part of a year with a bookmark about 1.5 chapters in.
It's only now in the last week or so that I've made a concerted effort to pick it up again and go through it. I'm nearly halfway through and enjoying it thoroughly. I've always enjoyed programming in the functional style, even in Perl, but Haskell feels so much nicer (within its realm).
What really caught my eye, though, was the definition of quicksort. I've read descriptions of the algorithm a few times (I'm not a trained Computer Scientist and have no formal training), but never really understood it. The implementation in the book just blew me away with its simplicity:
qSort
:: [Int] -> [Int]
qSort [] = []
qSort (x:xs) = qSort [y | y <- xs, y <= x] ++ [x] ++ qSort [y | y <- xs, y > x]
It's not the fastest implementation, it's not the most general. But I find it an incredibly clear demonstration of the algorithm. This is my rough translation in Perl.
sub qSort {
return unless @_;
my ($x, @xs) = @_;
return (
qsort( grep { $_ <= $x } @xs ),
$x,
qsort( grep { $_ > $x } @xs ),
);
}
slow (Score:1)
numbers I saw (from the shootout) made Haskell
look so much slower than ocaml that I really
didn't see the point.
Re:slow (Score:2)
I've not played with OCaml at all, I just liked what I saw in Haskell.
-Dom
Re:slow (Score:1)
sucks, and the compiler is QPL-ed, which totally
sucks.
Also, dynamic linking is kind of half-assed, and
isn't even implemented unless you're running Red
Hat / Debian / etc..
A good ocaml intro is Rich Jones's tutorial:
http://www.merjis.com/richj/computers/ocaml/tutorial/
Optimized for what? (Score:1)
Re:Optimized for what? (Score:2)
Off the top of my head, I can only think of one application in Haskell: darcs [abridgegame.org]. Mind you, I can only think of one in ocaml: MLDonkey [nongnu.org]. I'm sure there are more, but I don't think that there are that many...
I wish I knew what my point here was, but I've just woken up. Darn.
-Dom