Category Archives: Software

Why I Love Haskell In One Simple Example

I recently implemented some new Haskell numeric types that, instead of performing calculations, can generate a rendering of the requested calculation or store units with it.

Here you see a transcript of my session with a Haskell interpreter. The mathematical statements I am entering after the “>” are standard Haskell expressions, and, as I demonstrate, normally evaluate to a single result.

Once I get a more powerful simplifier, I will probably write a LaTeX exporting function as well.

The entire implementation of this, BTW, is less than 200 lines.

NumTest> 5 + 1 * 3
8
NumTest> prettyShow $ 5 + 1 * 3
"5+(1*3)"
NumTest> rpnShow $ 5 + 1 * 3
"5 1 3 * +"
NumTest> prettyShow $ 5 + 1 * 3
"5+(1*3)"
NumTest> prettyShow $ simplify $ 5 + 1 * 3
"5+3"
NumTest> prettyShow $ 5 * (Symbol "x") + 3
"(5*x)+3"
NumTest> 5 / 2
2.5
NumTest> (units 5 "m") / (units 2 "s")
2.5_m/s
NumTest> (units 5 "m") / 2
2.5_m
NumTest> 10 * (units 5 "m") / (units 2 "s")
25.0_m/s
NumTest> sin (pi/2)
1.0
NumTest> sin (units (pi/2) "rad")
1.0_1.0
NumTest> sin (units 90 "deg")
1.0_1.0
NumTest> (units 50 "m") * sin (units 90 "deg")
50.0_m
NumTest> ((units 50 "m") * sin (units 90 "deg")) :: Units (SymbolicManip Double)
50.0*sin(((2.0*pi)*90.0)/360.0)_m
NumTest> rpnShow $ dropUnits $ ((units 50 "m") * sin (units 90 "deg"))
"50.0 2.0 pi * 90.0 * 360.0 / sin *"
NumTest> (units (Symbol "x") "m") * sin (units 90 "deg")
x*sin(((2.0*pi)*90.0)/360.0)_m

Also, I defined this in my source file:

test :: forall a. (Num a) => a
test = 2 * 5 + 3

Now, it can be used:

NumTest> test
13
NumTest> rpnShow test
"2 5 * 3 +"
NumTest> prettyShow test
"(2*5)+3"
NumTest> test + 5
18
NumTest> prettyShow (test + 5)
"((2*5)+3)+5"
NumTest> rpnShow $ test + 5
"2 5 * 3 + 5 +"

You can grab the very early experimental code with darcs get http://darcs.complete.org/num.

Haskell has no built-in support for numeric types with units, arbitrary symbols carried through computations, etc. But it was trivial to add it. This kind of extensibility is a key part of why Haskell is so amazing.

Reiser4 Experiences

I’ve been a long-time user of JFS, but have grown unhappy with it for various reasons. So, I decided to try out XFS. It proved no better than JFS or ReiserFS 3 with data integrity during a crash.

Next step: Reiser4. I’ve been using Reiser4 for the past month or so on three different machines. I must say that I’m quite impressed with it. It is a stellar performer and it also recovers well from crashes. I mount all my filesystems with the nopseudo option, which essentially makes Reiser4 have standard Unix filesystem semantics in every way. I’m very pleased with it so far.

Thank you, darcs

Here’s a use case for Darcs.

All the blogs hosted here run Drupal. I have a whole slew of add-on modules, themese, and a few patches. It’s a pain to manage them all, so after moving to Drupal 4.6.0, I decided to store my Drupal tree in Darcs.

Drupal 4.6.1 just came out. I used darcs_load_dirs to load it into my upstream repository, then darcs pull to pull it into my main tree.

It worked perfectly, first time. Very, very nice.

Now maybe in this particular case, Arch could have done as well, but I sure was impressed at how easy darcs made it all.

When Newsreaders Aren’t

I clicked on a headline for an article titled Firefox news readers run the gamut. Sounded interesting; I’m not particularly happy with slrn, but I use it because there’s nothing better.

I thought it would be odd that there would be more than one newsreader, and one integrated into Firefox no less. So I was curious and clicked the link.

Surprise — it wasn’t talking about news readers at all, but rather RSS aggregators.

GRRR.

A news reader should be for *Usenet*.

Speaking of which, RSS is superflous. One could use NNTP to publish headlines and summaries anyway, and not require the development of a whole slew of software for yet another annoying protocol.