1 A Haskell Lover's Plea
From haskell@CS.YALE.EDU Thu Mar 16 18:03:34 1995 From: firstname.lastname@example.org Subject: A Haskell Lover's Plea
A Haskell Lover's Plea
Why should I renounce for you, dear Haskell, My much yearned for side-effects? Why should I face the software dragons Without my weapon, my manly spear of destruction? They call you non-strict, oh so elegant and pure Ariel. Yet side-effect celibacy is surely severe.
Your flesh is too weak, you brutish beast. The tarpit demons of software hell await you! This sinful habit in which you indulge Does more harm than good. Restrain yourself! And you too will see The wondrous and refined joys of referential transparency!
Alas, I can do without goto, without call/cc. But sans side-effects, I am lost and forlorn, can't you see? Oh, lady fairer yet than admirable Miranda (tm), Scheme's prolix, parenthetical tedium Is no match for your elegant syntax. What's more, Your list comprehensions outshine even Prolog for sure...
Ah, flatter me not, you low-spirited Caliban! Do you not know what advantages await Those who renounce destructive update? Start with an immaculate high-level specification, Throw in some algebraic code transformation. Soon you will have a provably correct and maintainable implementation.
Show mercy on mere mortals like me! How I dream still of the efficient pleasures of pointer manipulation! How I too wish to mutate memory with thoughts born of von Neumann earthiness! Relent! Relent! Let me have my assignment, my printf, my gensym. Let me fulfill my destructive impulses. Let me set bang. Let me update. Let me assign. Let me mutate.
Fear not, lowly beast, I have heard your pleas. To satisfy your low-level desire I'll give you monads, linear types, MADTs, Even single-threaded polymorphic lambda calculi. My beauty may suffer, still I will aspire To let you do (within typeful limits) what you please.
Rejoice! Rejoice! I'm free! I'm free! The best of both worlds is mine at last. Oh, infinite progeny of Church, Hope, and ML, I curry favor not when I say: Scan me right, fold me left, Lazy lady of many shapes, you've got class.
Don Smith (email@example.com)
2 Ode from a Haskeller to a Schemer
From: Benjamin L. Russell <DekuDekuplex <at> Yahoo.com> Subject: Ode from a Haskeller to a Schemer [Was: Re: Santana on my evil ways] Newsgroups: gmane.comp.lang.haskell.cafe Date: Mon Jul 7 02:26:37 EDT 2008 Ode from a Haskeller to a Schemer Recursion was my curse, 'Till mapping came to fame, Parens to tail-recurse, Fade, monads are to blame. Let, let*, or letrec? They were my bar and foo. Now, monads have my neck: What shall there be to do? Recurse or iterate? The processes, too late! To map, fold, or filter: That is the question, sir. In Scheme, I threw a fit: Eval: how to write it? In Haskell, no more wait: Reactive-animate! -- by Benjamin L. Russell, July 7, 2008 (Tokyo time)
3 Reading A Monad Tutorial
From: Ketil Malde <ketil <at> malde.org> Subject: Reading A Monad Tutorial (Re: [Haskell-cafe] Ode from a Haskeller to a Schemer) Newsgroups: gmane.comp.lang.haskell.cafe Date: Mon Jul 7 04:21:33 EDT 2008
(With apologies to Queen.) Is this the RealWorld#? Is this I/O I see? Caught in a monad - No escape back to purity Open a file, it wipes out my smile to see I'm just a programmer, don't need a Ph.D I'm easy come, easy go Don't need this high brow weird monadic action, no real reaction for me, from G-HC Hey man, I just found out that it is easy to achieve using unsafeInterleave and unsafe...PerformIO but people tell me I should let those go Oh man, no-o-o I'm about to start to cry If I can't make this stuff compile tomorrow I will just carry on Nothing really matters. Too late - 'cause I got it now there are monads all around IO, State and lists abound It's easy, like those people say but my program got abstracted all away! Maybe - o o o, It's a monad too, I know Why should I use another language at all? -k
4 The Naming of Code
From ajb at spamcop.net Date: Mon Oct 6 20:53:15 2008 Subject: [Haskell-cafe] Name for Haskell based VPN Client/Server
The naming of code is a difficult matter, It isn't just one of your LAN party games; You may think at first I'm as mad as a hatter When I tell you, your code must have THREE DIFFERENT NAMES.
First of all, there's the name that you use in publicity Such as Functional Forms, Nanocurses and HaRT, Such as Proof General Kit, vector-space, and hinotify, That will roll off the tongue and look good on slashdot.
But I tell you, your code needs a name that's evoking, A name that inhabits the package namespace. Such as Text.PrettyPrint.HughesPJ, Data.ByteString, That's easily typed when importing MixedCase.
But above and beyond, there's the name that's unique, And that is a name that is carefully picked. The one that's so mangled it may well be Greek; When it sits in slash-bin, it must never conflict.
It's the name that will cause most dissent with your peers, Far, far more than the task it is meant to perform. It should work with your fingers, though not with your ears, So de-vowel-ified acronym soup is the norm.
When you see a developer miffed and distracted, Tearing hair out in chunks or pacing without aim, They are greatly afflicted by anger protracted, Because somebody, somewhere, did not like the name. The simple, recognizable, Unrealizable, Deep, unattainable, singular Name.